【问题标题】:Difference in SHA Hash between git hash-object & git hash-object -tgit hash-object 和 git hash-object -t 之间 SHA 哈希的区别
【发布时间】:2014-01-27 14:40:26
【问题描述】:

我想在不使用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 选项,我会得到一个不同的 Hash。如何使用 shasum 计算提交哈希?

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

【问题讨论】:

    标签: git hash sha


    【解决方案1】:

    您更改了用于编写哈希的对象的类型。
    来自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

    【讨论】:

    • 好的。有没有办法找出该内容将是什么,以便我可以使用 SHA1 来完成?那就是通过添加其他内容使其也适用于提交选项?
    • @RamGAthreya 如slidetocode.com/2013/08/25/how-git-works 所示,你可以这样做:python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))" &lt; .git/objects/02/b365d4af3ef6f74b0b1f18c41507c82b3ee571:第一个词将是内容的类型。
    • 感谢您的帮助
    • @RamGAthreya 我已将您的编辑 (stackoverflow.com/review/suggested-edits/3905058) 包含在内,但被错误拒绝。
    • 是的,我认为最后的链接真正指出了大部分内部结构是如何工作的,读起来非常有趣。感谢您的链接
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多