Ich hatte einen Festplattenfehler, der dazu führte, dass einige Dateien eines Git-Repositorys beschädigt wurden. Beim Laufen git fsck --full
bekomme ich folgende Ausgabe:
error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted
Ich habe Backups des Repositorys, aber das einzige Backup, das die Pack-Datei enthält, hat es bereits beschädigt. Ich denke also, ich muss einen Weg finden, um die einzelnen Objekte aus verschiedenen Backups abzurufen und Git irgendwie anzuweisen, ein neues Paket mit nur korrekten Objekten zu erstellen.
Können Sie mir bitte Hinweise geben, wie ich mein Repository reparieren kann?
git
corruption
data-recovery
Christian
quelle
quelle
.git
natürlich ohne den Ordner) in das frisch geklonte Repo ... und danngit status
im neuen Repo ... git erkennt alle betroffenen Änderungen an meinen Dateien korrekt und ich kann meine Arbeit wieder aufnehmen.Antworten:
In einigen früheren Sicherungen wurden Ihre fehlerhaften Objekte möglicherweise in verschiedene Dateien gepackt oder sind noch lose Objekte. So können Ihre Objekte wiederhergestellt werden.
Es scheint, dass Ihre Datenbank einige fehlerhafte Objekte enthält. Sie können es also manuell machen.
Wegen
git hash-object
,git mktree
undgit commit-tree
die Objekte nicht schreiben , weil sie in der Packung zu finden sind, dann beginnen dies zu tun:(Ihre Pakete werden aus dem Repository entfernt und erneut darin entpackt. Nur die guten Objekte befinden sich jetzt in der Datenbank.)
Du kannst tun:
und überprüfen Sie den Typ des Objekts.
Wenn der Typ blob ist: Rufen Sie den Inhalt der Datei aus früheren Sicherungen ab (mit
git show
odergit cat-file
odergit unpack-file
; dann können Siegit hash-object -w
das Objekt in Ihrem aktuellen Repository neu schreiben.Wenn der Typ Baum ist: Sie können
git ls-tree
den Baum aus früheren Sicherungen wiederherstellen. danngit mktree
, um es erneut in Ihr aktuelles Repository zu schreiben.Wenn der Typ ist begehen: das gleiche mit
git show
,git cat-file
undgit commit-tree
.Natürlich würde ich Ihre ursprüngliche Arbeitskopie sichern, bevor ich diesen Prozess starte.
Schauen Sie sich auch an, wie Sie ein beschädigtes Blob-Objekt wiederherstellen können .
quelle
.git/objects/pack/
ist leerBanengusk brachte mich auf den richtigen Weg. Als weitere Referenz möchte ich die Schritte veröffentlichen, die ich unternommen habe, um die Beschädigung meines Repositorys zu beheben. Ich hatte das Glück, alle benötigten Objekte entweder in älteren Paketen oder in Repository-Backups zu finden.
quelle
Versuchen Sie zunächst die folgenden Befehle (führen Sie sie bei Bedarf erneut aus):
Und dann haben Sie immer noch die Probleme, versuchen Sie können:
Entfernen Sie alle beschädigten Objekte, z
Entfernen Sie alle leeren Objekte, z
Überprüfen Sie eine Nachricht "defekter Link" durch:
Hier erfahren Sie, aus welcher Datei der beschädigte Blob stammt!
Wenn Sie eine Datei wiederherstellen möchten, haben Sie möglicherweise großes Glück und es ist möglicherweise die Version, die Sie bereits in Ihrem Arbeitsbaum ausgecheckt haben:
wieder, und wenn es den fehlenden SHA1 (4b945 ..) ausgibt, sind Sie jetzt fertig!
Unter der Annahme, dass eine ältere Version defekt war, ist der einfachste Weg:
und das zeigt Ihnen das gesamte Protokoll für diese Datei (bitte beachten Sie, dass der Baum, den Sie hatten, möglicherweise nicht der Baum der obersten Ebene ist, sodass Sie selbst herausfinden müssen, in welchem Unterverzeichnis er sich befand), dann können Sie das jetzt neu erstellen fehlendes Objekt mit Hash-Objekt wieder.
um eine Liste aller Refs mit fehlenden Commits, Bäumen oder Blobs zu erhalten:
Es ist möglicherweise nicht möglich, einige dieser Verweise mit den regulären Befehlen branch -d oder tag -d zu entfernen, da sie sterben, wenn git die Beschädigung bemerkt. Verwenden Sie stattdessen den Installationsbefehl git update-ref -d $ ref. Beachten Sie, dass bei lokalen Verzweigungen dieser Befehl möglicherweise die veraltete Zweigkonfiguration in .git / config zurücklässt. Es kann manuell gelöscht werden (siehe Abschnitt [Zweig "$ ref"]).
Nachdem alle Refs sauber sind, kann es immer noch zu fehlerhaften Commits im Reflog kommen. Sie können alle Reflogs mit git reflog expire --expire = now --all löschen. Wenn Sie nicht alle Reflogs verlieren möchten, können Sie die einzelnen Refs nach defekten Reflogs durchsuchen:
(Beachten Sie die hinzugefügte Option -g zur git-Rev-Liste.) Verwenden Sie dann git reflog expire --expire = now $ ref für jede dieser Optionen. Wenn alle defekten Refs und Reflogs verschwunden sind, führen Sie git fsck --full aus, um zu überprüfen, ob das Repository sauber ist. Baumelnde Objekte sind in Ordnung.
Im Folgenden finden Sie eine erweiterte Verwendung von Befehlen, die möglicherweise zum Verlust Ihrer Daten in Ihrem Git-Repository führen können, wenn sie nicht mit Bedacht verwendet werden. Erstellen Sie daher ein Backup, bevor Sie versehentlich weitere Schäden an Ihrem Git anrichten. Probieren Sie es auf eigenes Risiko aus, wenn Sie wissen, was Sie tun.
So ziehen Sie den aktuellen Zweig nach dem Abrufen über den vorgelagerten Zweig:
Sie können auch versuchen, einen neuen Zweig auszuchecken und den alten zu löschen:
Versuchen Sie den folgenden Befehl, um das beschädigte Objekt in git zum Entfernen zu finden:
Verwenden Sie für OSX
sed -E
anstelle vonsed -r
.Eine andere Idee ist, alle Objekte aus Packdateien zu entpacken, um alle Objekte in .git / object neu zu generieren. Versuchen Sie daher, die folgenden Befehle in Ihrem Repository auszuführen:
Wenn dies nicht hilft, können Sie versuchen, die Git-Objekte von einem anderen Repo zu synchronisieren oder zu kopieren, z
So beheben Sie den defekten Zweig beim Auschecken wie folgt:
Versuchen Sie es erneut zu entfernen und aus dem Upstream auszuchecken:
Falls Git Sie in einen getrennten Zustand versetzt, checken Sie den ab
master
und führen Sie den getrennten Zweig darin zusammen.Eine andere Idee ist, den vorhandenen Master rekursiv neu zu gründen:
Siehe auch:
quelle
Hier sind die Schritte, die ich ausgeführt habe, um ein beschädigtes Blob-Objekt wiederherzustellen.
1) Identifizieren Sie einen beschädigten Blob
Der beschädigte Blob lautet 241091723c324aed77b2d35f97a05e856b319efd
2) Bewegen Sie den beschädigten Blob an einen sicheren Ort (nur für den Fall)
3) Holen Sie sich Eltern von korrupten Blob
Der übergeordnete Hash lautet 0716831e1a6c8d3e6b2b541d21c4748cc0ce7180 .
4) Holen Sie sich den Dateinamen, der dem beschädigten Blob entspricht
Suchen Sie diese bestimmte Datei in einem Backup oder im Upstream-Git-Repository (in meinem Fall dump.tar.gz ). Kopieren Sie es dann irgendwo in Ihr lokales Repository.
5) Fügen Sie zuvor beschädigte Dateien zur Git-Objektdatenbank hinzu
6) Feiern!
quelle
git ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: Could not read 19505205fd1f219993da9b75846fff3cf432152d
, und ich versuchte es auch noch einmal ohne Schritt 2, und das führte zugit ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: inflate: data stream error (invalid stored block lengths) fatal: failed to read object 19505205fd1f219993da9b75846fff3cf432152d: Invalid argument
Git Checkout kann tatsächlich einzelne Dateien aus einer Revision auswählen. Geben Sie einfach den Commit-Hash und den Dateinamen ein. Nähere Infos hier.
Ich denke, der einfachste Weg, dies sicher zu beheben, besteht darin, auf die neueste nicht festgeschriebene Sicherung zurückzugreifen und dann selektiv nicht beschädigte Dateien aus neueren Commits auszuwählen. Viel Glück!
quelle
Hier sind zwei Funktionen, die hilfreich sein können, wenn Ihre Sicherung beschädigt ist oder wenn Sie auch einige teilweise beschädigte Sicherungen haben (dies kann passieren, wenn Sie die beschädigten Objekte sichern).
Führen Sie beide in dem Repo aus, das Sie wiederherstellen möchten.
Standardwarnung: Nur verwenden, wenn Sie wirklich verzweifelt sind und Ihr (beschädigtes) Repo gesichert haben. Dies löst möglicherweise nichts, sollte aber zumindest den Grad der Korruption hervorheben.
und
quelle
Ich habe dieses Problem behoben, um einige Änderungen wie git add -A und git commit erneut hinzuzufügen.
quelle