git commit funktioniert nicht mehr - Fehler beim Erstellen von Bäumen

72

Ich kann keine Änderung vornehmen:

$ git commit
error: invalid object 100644 13da9eeff5a9150cf2135aaed4d2e337f97b8114 for 'spec/routing/splits_routing_spec.rb'
error: Error building trees

Ich habe es bisher versucht:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114

und auch:

$ git prune
error: Could not read 1394dce6fd1ad15a70b2f2623509082007dc5b6c
fatal: bad tree object 1394dce6fd1ad15a70b2f2623509082007dc5b6c

und auch:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114

aber nichts half. Soll ich die Datei löschen, festschreiben und wieder einführen? Ich bin bereit, ein bisschen Geschichte zu verlieren, wenn es Git Commit zurückbringt.

gorn
quelle
Sie haben Backups Ihres Systems, nicht wahr? Können Sie sich nicht von einem erholen?
Jonathan Leffler
13
@ JonathanLeffler, ob er es tut oder nicht, hat keinen Einfluss auf die Antwort, wie man Git repariert.
Paul Draper

Antworten:

16

Möglicherweise befindet sich ein beschädigtes Objekt in Ihrem Git-Repository.

Wenn Sie eine Fernbedienung oder andere Klone dieses Repositorys haben, können Sie von dort aus die problematische Datei abrufen und sie einfach in Ihrem lokalen Repo ersetzen.

Die gewünschte Datei befindet sich in:

/repo/.git/objects/13/da9eeff5a9150cf2135aaed4d2e337f97b8114
LopSae
quelle
3
In meinem Fall befindet sich die referenzierte Datei nicht mehr im Ordner .git-Objekte! >. <
mix3d
Genau: Sie möchten es in anderen Klonen des
Repos
Hatte das gleiche Problem aufgrund eines E / A-Fehlers. Ich konnte die Datei nicht ersetzen, aber ich habe den gesamten Ordner entfernt (im angegebenen Beispiel /local/.git/objects/13/) und eine Kopie davon von meinem Remote-Repo kopiert. Es hat den Trick gemacht und alles funktioniert wieder! danke
Simon C.
5
Die Antwort von @AlexNikulin unten ist eine noch bessere Lösung:git hash-object -w spec/routing/splits_routing_spec.rb
sagannotcarl
6
Ich habe diese Antwort abgelehnt, weil sie git hash-object -w(für mich) besser funktioniert hat.
Nikos Alexandris
111

Dieser Fehler bedeutet, dass Sie eine Datei mit Hash 13da9eeff5a9150cf2135aaed4d2e337f97b8114haben und dieser Hash nicht vorhanden .git/objects/../oder leer ist. Als dieser Fehler auftrat, hatte ich nur diesen Hash im Fehler, ohne den Dateipfad. Dann habe ich versucht git gc --autound git reset --hard. Nach einem dieser Befehle (diese Befehle haben mein Problem nicht behoben) habe ich den Pfad der Datei erhalten, die den Fehler auslöst.

Sie müssen nur den Objekt-Hash generieren:

git hash-object -w spec/routing/splits_routing_spec.rb

Weitere Informationen finden Sie in der Dokumentation . In der Dokumentation gibt es eine zusätzliche Möglichkeit, diesen Fehler zu beheben.

PS Dies war der einzige Weg, der für mich hilfreich war.

Alex Nikulin
quelle
2
Genial, danke dafür. Ich habe viele meiner Vorräte vor dem völligen Verlust bewahrt. Ich habe Ihre Antwort aktualisiert, um die spezifische Datei und den Pfad aus dem OP zu verwenden.
Joshua Pinter
1
Ich habe dies getan und es funktioniert, aber der Fehler tritt beim nächsten Versuch erneut auf. Gibt es eine dauerhafte Lösung?
NotSoShabby
@NotSoShabby ist vielleicht das Problem mit Ihrer Festplatte. Ihre Metadatei ist durch ein Prozess- oder Hardwareproblem beschädigt.
Alex Nikulin
Dies funktioniert gut, sollte die akzeptierte Antwort sein
Deepak Raj
13

git reset --hard sollte Ihr Repository wieder normalisieren, aber Sie werden nicht festgeschriebene Änderungen verlieren.

Tom Macdonald
quelle
8
$ git reset --hard gibt fatale: Baum 2287adf1b2a974541ce5806abc23dbd79814d666 kann nicht gelesen werden
gorn
2
git.wiki.kernel.org/index.php/… könnte dann helfen.
Tom Macdonald
3
+1 zurücksetzen - hart hat für mich gearbeitet. Mein Problem ist, dass Google Drive meinen lokalen Code auf mehreren Computern synchronisiert. Sie müssen daran denken, ihn anzuhalten und neu zu starten, damit er synchronisiert werden kann. Ich denke, Google Drive muss die Überwachung von .git-Verzeichnissen wegen der Massenänderungen absichtlich ignorieren.
eduncan911
Achtung. Mit diesem Befehl werden nicht festgeschriebene Änderungen verworfen.
iplus26
8

Wenn die problematische Datei durch Ihre Änderung hinzugefügt wird, können Sie sie einfach aus dem Index entfernen und erneut hinzufügen:

git reset <file> 
git add <file>
Archias
quelle
2
Dies funktioniert nicht, wenn die Datei jetzt auf Ihrem Laufwerk fehlt. Da keine physische Datei zurückgesetzt werden muss, erhalten Sie eine fatal: ambiguous argument 'path/to/file.ext': unknown revision or path not in the working tree.Nachricht
mix3d
6

Für mich war es nur eine Berechtigungsfrage. Wenn ich mit renne sudo, hat es funktioniert. Vielleicht etwas mit der Mac-Umgebung zu tun

lettisch
quelle
sudo ist ein bisschen zu freizügig, aber es war in der Tat ein Erlaubnisproblem. Es wurde behoben, indem der Besitz des gesamten Ordners dem richtigen Benutzer wiederhergestellt wurde.
Nicolas Modrzyk
3

In meinem Fall habe ich es gelöst durch:

git reset --mixed
Sathibabu P.
quelle
2

Dies kann durch Synchronisierungs-Apps von Drittanbietern wie Dropbox und Jianguoyun verursacht werden. Aufgrund meiner Erfahrung kann es zwei Möglichkeiten geben:

  1. Sie können versuchen, die letzten Synchronisierungsvorgänge rückgängig zu machen.
  2. Entfernen Sie die zugehörigen Dateien aus dem Ordner, schreiben Sie sie fest und verschieben Sie die Dateien zurück.
YiDing
quelle
1

Einfache Umgehungslösung: Wenn Sie sich nicht wirklich mit der Spur der Datei befassen, können Sie die Datei duplizieren und das Original entfernen, zuerst das Löschen und Hinzufügen festschreiben und dann wieder in Original umbenennen.

Git sollte normal wieder aufgebaut werden

Abd Rmdn
quelle
1
arbeitete für mich - danke abd, leerte den Ordner, schrieb fest, ersetzte dann die Dateien und legte fest
David
0

In meinem Fall ist die Datei im Remote-Zweig fehlerhaft. Ich habe es gelöst durch:

  1. Entfernen Sie die entfernten Zweige überhaupt durch $ git remote rm origin
  2. Fügen Sie die Fernbedienung wieder hinzu: $ git remote add origin <the-remote-url>
  3. Holen Sie die Fernbedienung erneut: $ git fetch origin
  4. Zurücksetzen auf den gewünschten Zweig am Ursprung (z. B. develop):$ git reset --hard origin/develop

Dann geht alles wieder normal.

Yang-Hsing Lin
quelle
0

In meinem Fall lag dies an einer anderen Version von git. Ich hatte mein Repository über den offiziellen Windows-Port von Git verwendet und begann, den MinGW-Port mit derselben Versionsnummer zu verwenden.

Dieses Problem trat auf, als ich versuchte, mich mit MinGW git zu verpflichten. Das Zurückschalten auf Windows Git löste das Problem.

Knallkopf
quelle
0
git hash-object -w spec/routing/splits_routing_spec.rb

Damit erstellt git ein Sha1 für die Datei.

Caio Kretzer
quelle