我们在运行
(注意:我并不在意未解决的提交消息。我关注的是sha1不匹配的问题。)
我的理解是,git-fsck从有效负载重新计算出sha1值,但发现与用于指定对象的sha1值不同。这些对象并没有丢失在存储库中(我已使用git cat-file进行了检查)。
奇怪的是,如果我再次运行该命令,则仍将收到sha1消息,但是针对不同的对象:
注意:在两次运行之间库没有发生变化。
我们正在运行Linux,当前的git版本为:
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提供)。
我做出了以下观察:
- 无效sha1值的对象通常位于同一范围内(在第一个示例中,sha1以ce或cf开头),并且在fsck运行期间在短时间内触发错误。我认为git-fsck进行有序扫描(或者对象在包内排序)。
- 这些对象是相对较大的blob(>900k)
- 我们运行了15分钟的完整memtest通过,以检测可能的硬件内存故障。我们没有发现任何问题。此服务器上还执行许多其他非git任务,也没有观察到任何其他奇怪的行为。
git gc
没有抱怨
目前的假设:
- 这个问题是由git的不正确构建(库版本?编译器?)引起的。
- 我们的memtest未能找到真正的内存问题。
- 对于大的blob,git-fsck sha1计算中存在微妙的bug,它会随机发生(或更精确地说,在某些短时间窗口内)。
我们该如何解决这个问题?
cp -ar
复制你的 .git 目录,然后使用diff -r
比较副本和原始文件。如果它们不同,那么 git 就没问题了。 - Wayne Conrad