From: 徐迪 Date: Mon, 20 Feb 2012 11:39:32 GMT Subject: Re: Manually decoding a git object Message-ID: In-Reply-To: <871uppbwnu.fsf@thomas.inf.ethz.ch> 2012/2/20 Thomas Rast : > Philip Oakley writes: > >> From: "Thomas Rast" Sent: Monday, February 20, >> 2012 8:29 AM >>> >>> 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. >>> I think Thomas got the point. > When I tried it from my home directory (not in a git directory): > $ git cat-file -p Git-Object > fatal: Not a git repository (or any of the parent directories): .git this is because git will first do a git-dir-search, if you're current work dir is not within git repo, it will die. I really do not know how you get thing that mess. From the link[1] you give, i think you just want to clone a repo across computer not by network, if so this[2] will be helpful. [1]:http://stackoverflow.com/questions/9343260/what-after-git-unpack-objects-to-get-the-actual-file [2]:http://progit.org/2010/03/10/bundles.html