Ich habe das gerade erlebt - meine Maschine stürzte beim Schreiben in das Git-Repo ab und es wurde beschädigt. Ich habe es wie folgt behoben.
Ich begann damit, mir anzusehen, wie viele Commits ich nicht auf das Remote-Repo übertragen hatte, also:
gitk &
Wenn Sie dieses Tool nicht verwenden, ist es sehr praktisch - soweit ich weiß auf allen Betriebssystemen verfügbar. Dies zeigte an, dass auf meiner Fernbedienung zwei Commits fehlten. Ich habe daher auf das Etikett geklickt, das das letzte Remote-Commit angibt (normalerweise wird dies der Fall sein /remotes/origin/master
), um den Hash zu erhalten (der Hash ist 40 Zeichen lang, aber der Kürze halber verwende ich hier 10 - dies funktioniert normalerweise trotzdem).
Hier ist es:
14c0fcc9b3
Ich klicke dann auf das folgende Commit (dh das erste, das die Fernbedienung nicht hat) und erhalte dort den Hash:
04d44c3298
Ich verwende dann beide, um einen Patch für dieses Commit zu erstellen:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Ich habe es dann ebenfalls mit dem anderen fehlenden Commit gemacht, dh ich habe den Hash des Commits vorher und den Hash des Commits selbst verwendet:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Ich bin dann in ein neues Verzeichnis umgezogen und habe das Repo von der Fernbedienung geklont:
git clone git@github.com:username/repo.git
Ich habe dann die Patch-Dateien in den neuen Ordner verschoben, sie angewendet und mit ihren genauen Festschreibungsnachrichten festgeschrieben (diese können aus git log
oder über das gitk
Fenster eingefügt werden ):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Dies stellte die Dinge für mich wieder her (und beachten Sie, dass es wahrscheinlich einen schnelleren Weg gibt, dies für eine große Anzahl von Commits zu tun). Ich war jedoch gespannt, ob der Baum im beschädigten Repo repariert werden kann, und die Antwort lautet, dass dies möglich ist. Führen Sie diesen Befehl in dem beschädigten Ordner aus, wenn ein repariertes Repo wie oben verfügbar ist:
git fsck
Sie werden so etwas bekommen:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Um die Reparatur durchzuführen, würde ich dies in dem kaputten Ordner tun:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
dh entfernen Sie die beschädigte Datei und ersetzen Sie sie durch eine gute. Möglicherweise müssen Sie dies mehrmals tun. Schließlich wird es einen Punkt geben, an dem Sie fsck
fehlerfrei laufen können. Der Bericht enthält wahrscheinlich die Zeilen "Dangling Commit" und "Dangling Blob". Diese sind eine Folge Ihrer Rebases und Änderungen in diesem Ordner und in Ordnung. Der Garbage Collector wird sie zu gegebener Zeit entfernen.
Daher bedeutet (zumindest in meinem Fall) ein beschädigter Baum nicht, dass nicht gepusste Commits verloren gehen.