Git repository поврежден (неправильная проверка заголовка; свободный объект поврежден)
я испытал сбой питания вчера вечером во время написания сообщения о фиксации. Когда я загрузил машину обратно, я не смог завершить фиксацию. Я побежал!--3-->, добавил обратно измененные файлы, и попробовал еще раз, и получил это:
% git commit
error: inflate: data stream error (incorrect header check)
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header
fatal: a94406345ac44982b00cf57b4b9660a35436637f is not a valid object
git fsck
показал следующее:
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack 4346883490a0990e68db0187241abc1642765a73 header
error: inflate: data stream error (incorrect header check)
fatal: loose object 4346883490a0990e68db0187241abc1642765a73 (stored in .git/objects/43/46883490a0990e68db0187241abc1642765a73) is corrupt
я заметил, что сообщения жалуются на разные объекты.
Я искал так и в интернете и пробовал несколько разных вещей, но не выгода.
- у меня нет последней резервной копии.
- клонирование репозитория в другой каталог не помогает; новый репозиторий демонстрирует точно такие же проблемы.
-
git stash
дает то же сообщение, что иgit commit
. Все остальные команды git, похоже, работают нормально.
как я могу сказать, что не так и исправить это?
Edit: git log
вывод, как было предложено (только первые несколько строки):
% git log --oneline --decorate --all |head -n 8
253b086 (HEAD, new_tokenize) Normalized tokenizer interface slightly
0f2425a (master) Added procs to eval layer
a4d4c22 Added procedures as a type
d1e15ad (tag: v0.10) Added `if' form with tail call semantics
f94a992 (tag: v0.9) Completed environments
031116e Fixed bug where # on a line by itself caused segfault
3d8b09f Added environments, define and set!
01cc624 Put symbol table implementation into types.c
это небольшой личный проект; обычно я просто работаю в (master), но в то время я делал эксперимент (new_tokenize). 253b086 был последним успешным коммитом перед сбоем питания.
3 ответов
похоже, что git создал файлы .git / objects для новой фиксации, но не удалось написать им. Я решил это, удалив их по одному и повторно запустив git fsck --full
найти следующий. Я начал с того, о котором первоначально сообщал git fsck
:
% rm -f .git/objects/43/46883490a0990e68db0187241abc1642765a73
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack 86e7247af5865e857a3b61eed99986e2d9538df1 header
error: inflate: data stream error (incorrect header check)
fatal: loose object 86e7247af5865e857a3b61eed99986e2d9538df1 (stored in .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1) is corrupt
% rm -f .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header
error: inflate: data stream error (incorrect header check)
fatal: loose object a94406345ac44982b00cf57b4b9660a35436637f (stored in .git/objects/a9/4406345ac44982b00cf57b4b9660a35436637f) is corrupt
и так далее. Я удалил пять объектов перед git fsck
вышел чистым, соответствующим (как я полагаю) пяти файлам в фиксации, которую я пытался сделать. Я предполагаю, что история файлов не была повреждена в все.
кстати, я подумал о другом методе, который, похоже, тоже работает. git clone
копирует плохие объекты, но git push
нет. После резервного копирования я создал новый пустой репозиторий (--bare, потому что иначе вы не можете нажать на master), затем разархивировал мои изменения и толкнул обе ветви в новый репозиторий. Тогда это был просто вопрос проверки его снова и восстановления последних изменений из моих резервных копий.
все еще интересно, если кто-то хочет пролить свет на механизм отказа здесь.
простой ответ на этот вопрос для тех, кто сталкивается с этой проблемой: команда git clone-это исправление, если у вас есть удаленное РЕПО, затем клонируйте его в локальную папку (после удаления поврежденного локального РЕПО), если у вас нет удаленного РЕПО, попробуйте нажать поврежденное РЕПО на github, а затем клонировать его оттуда, я думаю, что поврежденные объекты не будут нажаты, и это исправит проблему
как описано в ответ Я побежал:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
который удалил все мои болтающиеся капли и болтающиеся коммиты, а также поврежденные объекты БД.
Это было намного быстрее, чем отслеживать их один за другим!