我想在不使用git哈希对象函数的情况下计算git SHA哈希,也就是说我想用shasum函数来计算它。
我知道以下情况
body="tree 491e9405120eaaa57cce3938fd38508d85a5e08b
parent 8550f0f1a7e32fb1bb0933b0294c116a8dbe6dce
author user <me@example.com> 1390718030 +0000
committer user <me@example.com> 1390718030 +0000
This is a test"
echo $body | git hash-object -w --stdin #755481b921f13bcfd731d74287a0c5847519ee81
l=`expr ${#body} + 1`
echo -e 'blob $l\0$body' | shasum #755481b921f13bcfd731d74287a0c5847519ee81
哈希是一样的。但是如果我在hash-object中使用-t commit选项,我会得到一个不同的Hash。如何使用shasum计算提交哈希?
git hash-object -t commit --stdin <<< "$body" #b4c45adbbe35d3d3c73de48d039a8e3038f5ec54
答案 0 :(得分:2)
您更改了使用哈希编写的对象的类型
来自git hash-object
-t <type>
Specify the type (default: "blob").
您从默认blob转到提交。
实际编写的对象以对象类型开始,这是sha1必须计算的部分 参见:
Git计算文件的SHA1(或者,在Git术语中,计算“blob”):
sha1("blob " + filesize + "\0" + data)
这改变了sha1考虑的内容。
使用-t commit
,您可以修改该前缀(它不再是“blob
”),并且由于内容不同,因此sha1也不同。
你可以做:
python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))" < .git/objects/02/b365d4af3ef6f74b0b1f18c41507c82b3ee571:
第一个单词将是内容的类型
有关进一步参考,请查看How Git Works