При выполнении команды 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 отличается от того, который использовался для обозначения объекта. Объекты не отсутствуют в хранилище (я проверяю w / 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 выполняет упорядоченное сканирование (или, возможно, объекты сортируются в пакете).
- Эти объекты - относительно большие капли (> 900 КБ)
- Мы выполнили 15-минутный полный проход memtest для возможного сбоя аппаратной памяти. Мы не нашли никаких проблем. На этом сервере не наблюдается другого странного поведения, которое также выполняет множество других не-git задач.
git gc
не жалуется
Гипотезы пока:
- Эта проблема вызвана неправильной сборкой git (версия библиотеки? Compiler?)
- Нашему тесту не удалось обнаружить реальную проблему с памятью.
- Существует небольшая ошибка в вычислении шага git-fsck, которая возникает случайным образом (или, точнее, в определенных коротких временных окнах) для больших BLOB-объектов.
Как мы можем решить это?