Git fsck 报告 "sha1 不匹配"

4
我们在运行 git fsck --full --strict 命令时遇到了以下问题:
error: sha1 mismatch ced885d12a0677f2db9025e1e684c72e67283fcd

error: ced885d12a0677f2db9025e1e684c72e67283fcd: object corrupt or missing
error: sha1 mismatch cf5a1546bd2de5611eaf6136fb5ca02b4e358bec

error: cf5a1546bd2de5611eaf6136fb5ca02b4e358bec: object corrupt or missing
error: sha1 mismatch cf5d9d5723014921370de479c54a73230c86a981

error: cf5d9d5723014921370de479c54a73230c86a981: object corrupt or missing
error: sha1 mismatch cf675ce5bc5eeb5937441c6a02976cf2fa40076b

error: cf675ce5bc5eeb5937441c6a02976cf2fa40076b: object corrupt or missing
error: sha1 mismatch cf7c5156cf127eb7141505946df51b2b57925a50

error: cf7c5156cf127eb7141505946df51b2b57925a50: object corrupt or missing
dangling commit 3468455f0d9d055bbe957744aa10e670469d3912
dangling commit daeec54632203157a70bae93b9d7c3290820c2f9
(more dangling commit messages)

(注意:我并不在意未解决的提交消息。我关注的是sha1不匹配的问题。)
我的理解是,git-fsck从有效负载重新计算出sha1值,但发现与用于指定对象的sha1值不同。这些对象并没有丢失在存储库中(我已使用git cat-file进行了检查)。
奇怪的是,如果我再次运行该命令,则仍将收到sha1消息,但是针对不同的对象:
error: sha1 mismatch 1452752024456a509540591c4879b3e3534f457e

error: 1452752024456a509540591c4879b3e3534f457e: object corrupt or missing
error: sha1 mismatch 16e08310d7182e97092d2783c911dbcf66538238

error: 16e08310d7182e97092d2783c911dbcf66538238: object corrupt or missing
dangling commit 3468455f0d9d055bbe957744aa10e670469d3912

注意:在两次运行之间库没有发生变化。
我们正在运行Linux,当前的git版本为:
$git --version
git version 1.7.2.2.170.g5c7f2

这些错误在之前的版本中就已经存在了(1.6.5.rc2.18.g6d8b)。 这些git是使用gcc 3.4.4从源代码构建的。

但是,当我将存储库复制到另一台主机上时,git fsck根本没有报告任何问题。那里的git版本是1.7.2.1(由Fedora提供)。

我做出了以下观察:

  1. 无效sha1值的对象通常位于同一范围内(在第一个示例中,sha1以ce或cf开头),并且在fsck运行期间在短时间内触发错误。我认为git-fsck进行有序扫描(或者对象在包内排序)。
  2. 这些对象是相对较大的blob(>900k)
  3. 我们运行了15分钟的完整memtest通过,以检测可能的硬件内存故障。我们没有发现任何问题。此服务器上还执行许多其他非git任务,也没有观察到任何其他奇怪的行为。
  4. git gc没有抱怨

目前的假设:

  1. 这个问题是由git的不正确构建(库版本?编译器?)引起的。
  2. 我们的memtest未能找到真正的内存问题。
  3. 对于大的blob,git-fsck sha1计算中存在微妙的bug,它会随机发生(或更精确地说,在某些短时间窗口内)。

我们该如何解决这个问题?


2
由于您正在使用非稳定版本的Git,因此最好的咨询地点可能是Git列表或FreeNode IRC上的#git频道。我建议您从那里开始检查,因为这可能是Git的一个错误,也可能不是,但是在开发构建中,最好进行检查。 - Marcus Griep
也许你正在从磁盘读取随机损坏的数据。这可能是由于许多原因引起的,通常(但并非总是)是硬件问题。如果是硬件问题,除了内存之外的其他因素也可能会导致它。例如,尝试使用 cp -ar 复制你的 .git 目录,然后使用 diff -r 比较副本和原始文件。如果它们不同,那么 git 就没问题了。 - Wayne Conrad
@gawi - 哦,好吧。有时你是挡风玻璃,有时你是苍蝇。 - Wayne Conrad
如果你问我,这似乎是有问题的RAM...我会进行更彻底的内存测试...或者如果你的计算机中只有几个内存模块,那就逐个拆下来看看问题是否仍然存在...你提到了一个15分钟的内存测试,但这可能不够...使用像memtest86这样的工具,并让它通过所有内存和多种模式运行。 - Lasse
@Lasse 我们已经将我们的git仓库迁移到另一个主机上了。自那以后,问题就消失了。谢谢。 - gawi
显示剩余3条评论
1个回答

2
一定是某种硬件问题导致的。

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