2010-11-06 10 views
46

Ich habe einen Git-Pull, wenn ich in der Nähe meiner Quote war, und als Ergebnis (ich glaube so), bekam eine beschädigte Datei:Wie gehe ich mit beschädigten git-Objektdateien um?

$ git pull 
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git fsck --full 
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3 
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3 
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file 

Wie kann ich diese Korruption lösen?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp war null Byte; es zu löschen löste mein Problem nicht (gleiche Fehler).

+0

Der Inhalt muss sha1 zum Dateinamen addieren. Es gibt keine Möglichkeit, den Inhalt basierend auf dem Hash wiederherzustellen. Wenn Git also keine Art von Redundanz für diese genaue Situation eingebaut hat (ich kann nicht sagen, dass das nicht der Fall ist), würde ich sagen, dass Sie die Datei erneut abrufen oder klonen müssen wieder fern. – meagar

+0

Du hast gesagt du hast es gelöscht - hast du danach nochmal versucht? Ein temporäres Objekt der Größe 0 ist eine abgebrochene Übertragung ... – Cascabel

+0

Die Ausgabe von 'finden. -name d4a0e7599494bfee2b5351113895b43c351496b3' ist nichts. Wenn Sie die sha1-Datei löschen, wird nur die leere sha1-Datei generiert. – Mike

Antwort

31

Im Allgemeinen kann es schwierig sein, beschädigte Objekte zu reparieren. In diesem Fall sind wir jedoch zuversichtlich, dass das Problem eine abgebrochene Übertragung ist, was bedeutet, dass das Objekt in einem Remote-Repository ist. Daher sollten wir in der Lage sein, unsere Kopie sicher zu entfernen .

Die temporäre Objektdatei mit der Größe 0 kann natürlich einfach entfernt werden. Es wird uns nichts nützen. Das korrupte Objekt, das darauf verweist, d4a0e75..., ist unser wirkliches Problem. Es kann in .git/objects/d4/a0e75... gefunden werden. Wie ich oben sagte, ist es sicher zu entfernen, aber nur für den Fall, sichern Sie es zuerst.

Zu diesem Zeitpunkt sollte eine frische git pull erfolgreich sein.

... angenommen, dass es in erster Linie gelingen würde. In diesem Fall scheint es, dass einige lokale Änderungen die versuchte Zusammenführung verhindert haben, so dass ein stash, pull, stash pop in Ordnung war. Dies könnte jedoch bei jeder Zusammenführung passieren und hatte nichts mit dem beschädigten Objekt zu tun. (Es sei denn, es war eine Indexbereinigung notwendig, und das Versteck hat das gemacht ... aber ich glaube nicht.)

+1

Dies könnte dazu führen, "Fehler: Refs/Köpfe/Zweig zeigt nicht auf ein gültiges Objekt!". Stellen Sie sicher, zu sichern. –

5

Recovering from Repository Corruption ist die offizielle Antwort.

Die wirklich kurze Antwort lautet: Finden Sie unverfälschte Objekte und kopieren Sie sie.

+2

Dies ist nicht besonders hilfreich. Das fragliche korrupte Objekt ist fast sicher nicht eines, das wiederhergestellt werden muss; es ist eines, das teilweise von einer Fernbedienung geholt wurde. – Cascabel

+0

Dies war der einzige Weg, das war hilfreich für mich !!! Vielen Dank))) –

15

Sie können "find" verwenden, um alle Dateien in/objects Ordner mit 0 Größe zu entfernen mit Befehl find .git/objects/ -size 0 -delete. Backup wird empfohlen.

+0

hmm, das hat geholfen, nach dem Aussetzen habe ich ein paar Objekte leer und das Entfernen von ihnen erlaubte mir, reale Objekte aus dem Remote Repo zu holen. Zum Glück habe ich kurz vor dem Aussetzen gedrängt. Um zu sehen, was mit Dateien passiert ist, die ich noch nicht festgeschrieben habe, wurden sie hoffentlich vor dem Suspendieren mit der Festplatte synchronisiert. WARNUNG, speichern Sie die Hashes, die Sie löschen, wenn weitere Inspektionen erforderlich sind. – akostadinov

Verwandte Themen