git如何计算文件哈希值?

net*_*ope 120 git hash checksum sha1 git-hash

存储在树对象git ls-tree中的SHA1哈希值(由返回的sha1sum)与文件内容的SHA1哈希值不匹配(由返回)

$ git cat-file blob 4716ca912495c805b94a88ef6dc3fb4aff46bf3c | sha1sum
de20247992af0f949ae8df4fa9a37e4a03d7063e  -
Run Code Online (Sandbox Code Playgroud)

git如何计算文件哈希值?它是否在计算哈希值之前压缩内容?

Lei*_*ldt 116

Git为对象添加"blob"前缀,后跟长度(作为人类可读的整数),后跟NUL字符

$ echo -e 'blob 14\0Hello, World!' | shasum 8ab686eafeb1f44702738c8b0f24f2567c36da6d

资料来源:http://alblue.bandlem.com/2011/08/git-tip-of-week-objects.html

  • ^校正以上注释:*有时*git执行上面的替换,具体取决于一个人的eol/autocrlf设置. (7认同)
  • 您也可以将其与[`echo'Hello,World!' | git hash-object --stdin`](https://git-scm.com/docs/git-hash-object#_options)。(可选)您可以指定`--no-filters`以确保不进行crlf转换,或指定`--path = somethi.ng`以使git使用通过`gitattributes`指定的过滤器(也@ user420667)。和-w实际上将blob提交到.git / objects(如果您在git repo中_are_)。 (3认同)
  • 还值得一提的是,它用“\n”替换了“\r\n”,但单独留下了孤立的“\r”。 (2认同)

Lor*_*mon 34

我只是在扩展答案,@Leif Gruenwoldt并详细说明提供的参考资料@Leif Gruenwoldt

自己做..

  • 步骤1.在存储库中创建一个空文本文档(名称无关紧要)
  • 步骤2.暂存和提交文档
  • 步骤3.通过执行确定blob的哈希值 git ls-tree HEAD
  • 步骤4.找到blob的哈希值 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
  • 第5步.抓住你的惊喜并阅读下面的内容

GIT如何计算其提交哈希值

    Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
Run Code Online (Sandbox Code Playgroud)

文本blob?是一个常量前缀,\0也是常量,是NULL字符.在<size_of_file><contents_of_file>取决于该文件.

请参阅:git commit对象的文件格式是什么?

这就是所有人!

可是等等!,你注意到它<filename>不是用于哈希计算的参数吗?如果两个文件的内容与创建它们的日期和时间及其名称无关,则它们可能具有相同的哈希值.这是Git处理移动和重命名的原因之一,比其他版本控制系统更好.

自己动手(Ext)

  • 步骤6. filename在同一目录中创建另一个具有不同的空文件
  • 步骤7.比较两个文件的哈希值.

注意:

该链接未提及tree对象是如何散列的.我不确定算法和参数但是根据我的观察,它可能根据它包含的所有blobstrees(它们的哈希值)计算哈希值


Cir*_*四事件 13

git hash-object

这是验证测试方法的快速方法:

s='abc'
printf "$s" | git hash-object --stdin
printf "blob $(printf "$s" | wc -c)\0$s" | sha1sum
Run Code Online (Sandbox Code Playgroud)

输出:

f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f
f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f  -
Run Code Online (Sandbox Code Playgroud)

这里sha1sum是GNU Coreutils的.

然后归结为理解每种对象类型的格式.我们已经涵盖了琐碎的blob事情,以下是其他事项: