git hash-object和git hash-object -t在SHA哈希上的差异

8e2ybdfx  于 2023-01-15  发布在  Git
关注(0)|答案(1)|浏览(108)

我不想使用git hash对象函数来计算git SHA hash,也就是说我想使用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选项,我会得到一个不同的哈希值。我如何使用shasum计算提交哈希值?

git hash-object -t commit --stdin <<< "$body" #b4c45adbbe35d3d3c73de48d039a8e3038f5ec54
waxmsbnn

waxmsbnn1#

您更改了写入哈希的对象的类型。
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

相关问题