显然相同的提交为什么会有不同的sha1值?为什么?

15

在使用我的脚本从仓库中重新编写子树历史记录后,我将其与同一子树上的 git filter-branch ... 命令的结果进行了比较。我发现初始提交具有不同的sha1,尽管我预期它们应该是相同的(这个结果就是两个历史记录中所有提交的sha1都不同)。

在这两个提交上执行 git show --format=raw <commit-sha1> 命令会产生完全相同的输出(除了第一行是 commit <commit-sha1>,表示结果)。

由于对象文件是二进制的,所以它们完全不同,但我无法找出根本原因。

假设所有 git 版本相互兼容,还有什么原因可以解释为什么会有 2 个不同的 sha1 值?

谢谢!


也许是更改电子邮件、更改提交日期或类似的元信息? - static_rtti
1个回答

14

Git对提交哈希的输入包括元数据,例如树的SHA1值、父节点的SHA1值、提交者的姓名、电子邮件和提交日期,以及作者的姓名、电子邮件和提交日期。因此,当您重写历史记录时,提交者的提交日期和树(因为您执行了filter-branch)可能已更改,因此您的提交的SHA1值存在差异。

要了解提交的格式更多信息,您可以使用git cat-file commit <sha>,或查阅Git Book中的Git对象章节


1
所有的树、父节点、电子邮件、日期、作者和提交者的名称都已报告。同时,您建议使用 git cat-file 很有帮助,因为我在记录的注释中看到了一个额外的 '\n',而在 git show 中没有看到任何区别。我正在检查这个问题。 - bm842
1
我看到有些工具在提交消息结尾处添加了额外的空行,即使本来就没有(以便以空行结束)。也许这就是你的情况所发生的事情? - Sylvain Defresne
我确认我的脚本错误地添加了一个换行符。我已经修复了这个问题,现在拥有相同的sha1值。谢谢Sylvain。 - bm842

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接