在git hash-object和amp;之间的SHA Hash的区别git hash-object -t

时间:2014-01-26 06:42:33

标签: git hash sha

我想在不使用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

1 个答案:

答案 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