git-apply和git-am应该生成相同的哈希值吗?

6

我觉得我还缺少一些东西。 我的理解是,git使用SHA-1散列提交标识符意味着可以确定从别人那里获取的补丁是否已被更改。

看看我在我的机器上进行的这个测试(名称和电子邮件已更改):

cd dogcatcher
dogcatcher> git log
commit 926f347567a9da6f7692aca0e23d13f094d9e3a6
Author: Joe User <joe@test.com>
Date:   Sat Dec 17 15:28:55 2011 -0600

    3rd branch commit

commit 11e8055aa5e8f0d323c48b4f691adced7a8a9762
Author: Joe User <joe@test.com>
Date:   Sat Dec 17 15:10:44 2011 -0600

    second branch commit

commit 23deb7093a8565479092ef84142a0e2e7282d213
Author: Joe User <joe@test.com>

dogcatcher> git format-patch 23de  (format a patch containing everything since 23de)

dogcatcher> cd ..
~> cp -r dogcatcher catcatcher
cd catcatcher

catcatcher> git reset --hard 23de  (reset HEAD to 23de)
catcatcher> git am 00* (apply the two patch files)
catcatcher> git log

commit 2548980811d1875971ce1a018df98374950e0059
Author: Joe User <joe@test.com>
Date:   Sat Dec 17 15:28:55 2011 -0600

    3rd branch commit

commit 7d651d05344ba6e2cd18d8e24c0c350d0c7dec66
Author: Joe User <joe@test.com>
Date:   Sat Dec 17 15:10:44 2011 -0600

    second branch commit

commit 23deb7093a8565479092ef84142a0e2e7282d213
Author: Joe User <joe@test.com>

如您所见,最后两个提交的哈希值不同,这是由补丁创建的。或许这很有道理,毕竟补丁创建的文件时间戳是不同的。(我不确定哈希中包含哪些信息)
然而,如果是这样,我该如何验证我刚应用的补丁包含完全相同的代码? 我怎么知道发送给我的补丁文件的人没有做出恶意更改?
还是说我犯了一个错误,导致哈希值不同,如果我正确地完成了操作,就会得到相同的哈希值?
1个回答

11

默认情况下,git am 命令会将提交者时间设置为当前时间。你可以使用 --committer-date-is-author-date 参数来避免这种情况,但是它可能仍然会将你设置为提交者(实际上,它很可能会这样做)。你可以使用 git log --format=fuller 命令来验证这一点,该命令会显示提交者信息。


尝试将该标志添加到git am。没有效果。哈希仍然不同。我在两种情况下都是提交者,所以不是这个问题。 - wadesworld
3
@wadesworld:查看 git log --format=raw 的输出。这将显示原始提交对象。然后你可以比较它们以查看有什么不同(无论是作者信息、提交者信息、树的哈希值还是消息)。 - Lily Ballard
好的,我不知道之前运行这个测试时出了什么问题,但是我删除了我的原始测试仓库,再次尝试,现在一切都按预期工作。谢谢! - wadesworld
我遇到了同样的问题。使用 git log --format=raw 比较细节后,发现差异在提交者行上——它显示了来自两个系统的用户名、电子邮件地址和时间戳。我不确定如何修复它,因为这些信息似乎没有包含在补丁文件中,并且 git-am 似乎没有选项可以手动设置这些细节。我正在尝试解决暂时无法访问中央项目存储库的问题。 - bdsl
1
似乎我需要使用git bundle而不是git format-patch来获取匹配的提交ID。Git bundle将提交放入二进制文件中,可以像远程存储库一样复制到其他系统并从中提取。 - bdsl
@wadesworld 不可能有相同的SHA-1,因为每个提交对象都包含其父提交ID。 - haolee

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