Subject: Re: Manually decoding a git object

From: Thomas Rast <[email-masked]>
Date: Mon, 20 Feb 2012 09:29:46 +0100

"Philip Oakley" <[email-masked]> writes:

> If I have a renamed file which is a git object, such a "Git_Object", was
> 8c-something-or-other, what is the easiest way of examining / decoding /
> recreating the original file (either as its sha1, or a cat-file).
>
> I don't appear to be able to unzip the file in its raw format...  I'm using
> Msysgit on windows XP.

The SHA1 is over the decompressed object contents.  The file simply
holds a zlib-compressed stream of those contents.  (It's pretty much
like gzip without the file header.)

You can use any bindings to zlib and something that does sha1, e.g. in
python:

  $ cd g/.git/objects/aa/  # my git.git
  $ ls
  592bda986a8380b64acd8cbb3d5bdfcbc0834d  6322a757bee31919f54edcc127608a3d724c99
  $ python
  Python 2.7.2 (default, Aug 19 2011, 20:41:43) [GCC] on linux2
  Type "help", "copyright", "credits" or "license" for more information.
  >>> import hashlib
  >>> hashlib.sha1(open('592bda986a8380b64acd8cbb3d5bdfcbc0834d').read().decode('zlib')).digest().encode('hex')
  'aa592bda986a8380b64acd8cbb3d5bdfcbc0834d'

Notice that the first byte of the hash goes into the directory name.

-- 
Thomas Rast
trast@{inf,student}.ethz.ch