Ich habe gestern Abend einen Stromausfall erlebt, als ich eine Commit-Nachricht geschrieben habe. Beim Booten des Computers konnte ich das Commit nicht abschließen. Ich lief git reset
, fügte die geänderten Dateien wieder hinzu und versuchte es erneut und bekam Folgendes:
% 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
zeigt Folgendes:
% 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
Ich stelle fest, dass sich die Nachrichten über verschiedene Objekte beschweren.
Ich suchte SO und das Web und versuchte ein paar verschiedene Dinge, aber ohne Erfolg.
- Ich habe keine aktuelle Sicherungskopie.
- Das Klonen des Repositorys in ein anderes Verzeichnis hilft nicht. Das neue Repository weist genau die gleichen Probleme auf.
git stash
gibt die gleiche Nachricht wiegit commit
. Alle anderen Git-Befehle scheinen normal zu funktionieren.
Wie kann ich feststellen, was falsch ist, und es beheben?
Bearbeiten: git log
Ausgabe wie vorgeschlagen (nur die ersten Zeilen):
% 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
Dies ist ein kleines persönliches Projekt; Normalerweise arbeite ich nur in (Master), aber ich habe zu der Zeit ein Experiment durchgeführt (new_tokenize). 253b086 war das letzte erfolgreiche Commit vor dem Stromausfall.
git log
odergit log --oneline --decorate --all
zu sehen, wie die Geschichte aussiehtgit checkout
jede der im Protokoll aufgeführten IDs ändern ? Ich frage mich, ob eine Brute-Force-Lösung darin besteht, die einzelnen IDs zu skripten, die ID zu überprüfen und den Arbeitsbaum an eine andere Stelle (möglicherweise in ein neues Git-Repository) zu kopieren, um zu versuchen, ein nicht korruptes Repo neu zu erstellen.git fsck --full
, um herauszufinden, was aktuell auf die fehlerhaften Objekte verweist.Antworten:
Es scheint, dass git Dateien in .git / objects für das neue Commit erstellt hat, aber nicht erfolgreich darauf geschrieben hat. Ich habe es gelöst, indem ich sie einzeln gelöscht und erneut ausgeführt habe
git fsck --full
, um die nächste zu finden. Ich habe mit dem angefangen, von dem ursprünglich berichtet wurdegit fsck
:Und so weiter. Ich habe fünf Objekte gelöscht, bevor
git fsck
sie sauber angezeigt wurden. Dies entspricht (wie ich vermute) den fünf Dateien in dem Commit, das ich erstellen wollte. Ich denke, dass der Dateiversionsverlauf überhaupt nicht beschädigt wurde.Übrigens dachte ich an eine andere Methode, die auch zu funktionieren scheint.
git clone
kopiert die fehlerhaften Objekte,git push
tut dies aber nicht. Nach dem Sichern habe ich ein neues leeres Repository erstellt (--bare, da Sie sonst nicht zum Master pushen können), dann meine Änderungen aufgehoben und beide Zweige in das neue Repository verschoben. Dann ging es nur noch darum, es erneut zu überprüfen und die neuesten Änderungen aus meinen Backups wiederherzustellen.Immer noch interessiert, ob jemand hier Licht in den Fehlermechanismus bringen möchte.
quelle
del .git\index
undgit reset
Einfache Antwort auf diese Frage für alle, die mit diesem Problem konfrontiert sind: Der Befehl git clone ist die Lösung. Wenn Sie ein Remote-Repo haben, klonen Sie es in den lokalen Ordner (nachdem Sie das beschädigte lokale Repo gelöscht haben), falls Sie kein Remote-Repo haben, und versuchen Sie es dann Schieben Sie das beschädigte Repo auf Github und klonen Sie es dann von dort. Ich denke, dass beschädigte Objekte nicht verschoben werden und das Problem dadurch behoben wird
quelle
Wie in dieser Antwort beschrieben, lief ich:
Dadurch wurden alle meine baumelnden Blobs und baumelnden Commits sowie die beschädigten DB-Objekte entfernt.
Es war viel schneller, als sie einzeln aufzuspüren!
quelle