Wie gehe ich mit git gc fatal um? Fehlerhafte Objektreferenzen / Fernbedienungen / Ursprung / HEAD-Fehler?

131

Ich habe dies heute zufällig getroffen, als ich versuchte, Git Garbage Collect auszuführen :

$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

Wie gehe ich damit um?

Ryan
quelle

Antworten:

161

Ich verstehe die Konsequenzen nicht, aber wie in diesem Thread vorgeschlagen , habe ich es gerade getan, als ich darauf gestoßen bin

$ mv .git/refs/remotes/origin/HEAD /tmp

(für alle Fälle aufbewahren) und dann

$ git gc

arbeitete ohne sich zu beschweren; Ich habe keine Probleme gehabt.

Petrelharp
quelle
6
Es hat bei mir funktioniert und ich glaube, ich bin auf dieses Problem gestoßen, weil ich den Standardzweig von mastereinem anderen namens geändert habe develop. Tage bevor ich es wieder von developauf änderte masterund den alten Standardzweig löschtedevelop , zeigte die Datei in meinem Arbeitsverzeichnis .git/refs/remotes/origin/HEADimmer noch auf das, refs/remotes/origin/developwas nicht mehr existiert. In dieser Situation hat das Entfernen der Datei funktioniert.
Stavarengo
4
git prunehat für mich funktioniert, eine Möglichkeit, Daten zu löschen, die sich in Git angesammelt haben, auf die aber von nichts Nützlichem verwiesen wird.
Sven Malvik
Die Ausführung löste mein Problem:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
David Rauca
2
Ich vermute, der beste Weg wäre die Antwort von @ WilQu ( stackoverflow.com/a/49944297/660339 ). Kann jemand das bestätigen?
Ivan Perez
Entfernen dieser Datei aus dem .git-Ordner, als git gcfür mich gearbeitet
Vino
68

Das Problem, auf das ich gestoßen bin (das ist das gleiche Problem, das @Stavarengo in diesem Kommentar oben erwähnt hat), ist, dass der Standard-Remote-Zweig ( developin meinem Fall) gelöscht wurde, aber immer noch in verwiesen wurde.git/refs/remotes/origin/HEAD .

Das Öffnen .git/refs/remotes/origin/HEADin meinem Editor zeigte Folgendes:

ref: refs/remotes/origin/develop

Ich habe es sorgfältig bearbeitet, um auf meinen neuen Standardzweig zu verweisen, und alles war gut:

ref: refs/remotes/origin/master

Der Hinweis, der mich darauf hinwies, war, dass das Laufen git prunediesen Fehler zeigte:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD
Trenton
quelle
1
Das war auch meine Lösung
Dan Carlstedt
1
Dies war meine genaue Lösung. Unser Team hat kürzlich von einer Standard-
Zweigentwicklung
40

Nachdem ich Trentons Antwort gesehen hatte, sah ich meine an .git/refs/remotes/origin/HEAD und stellte fest, dass sie auch auf einen alten Zweig zeigte, der jetzt gelöscht ist.

Aber anstatt die Datei selbst zu bearbeiten, habe ich Ryans Lösung ausprobiert:

git remote set-head origin --auto

Es stellte die Datei automatisch auf den neuen Zweig ein und git gcfunktionierte danach einwandfrei.

WilQu
quelle
Ja, das funktioniert bei mir - genau wie im selben Szenario. git remote set-head $REMOTE --autoIn meinem Fall ist $ REMOTE der Remote-Alias ​​und nicht der Standard- "Ursprung", da ich mehrere Fernbedienungen eingerichtet habe.
Devy
29

Ich dachte, die Lösung wäre die folgende, da dies zu funktionieren schien, aber es stellte sich heraus, dass das Problem nicht wirklich gelöst wurde.

git remote set-head origin --auto
Ryan
quelle
1
Es sieht so aus, als hätte mir dieser Befehl geholfen, die gleichen Probleme loszuwerden. Nach diesem Befehl habe ich jedoch auch verwendet git prune(wie in der ersten Befehlsausgabe empfohlen), sodass ich nicht genau sagen kann, was mir geholfen hat - erstens, zweitens oder beides.
Borys Pylhun
1
git remote set-head origin --autoIch habe meine refs / remotes / origin / HEAD-Datei git prune
repariert,
Ich bin auf diesen Fehler gestoßen: error: Multiple remote HEAD branches. Please choose one explicitlyund musste verwenden git remote set-head origin mybranch(während der Zweig 'mybranch' ausgecheckt war), um den Fehler zu beheben.
derekmx271
3
Downvoting ist keine vollständige Antwort und kann irreführend sein.
Christian Vielma
9

Sieht so aus, als ob Ihre symbolischen Verweise möglicherweise beschädigt sind ... Versuchen Sie, sie wie folgt durch Ihren Standardzweig zu ersetzen: Mein Standardzweig ist beispielsweise master

$ git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
$ git fetch --prune
$ git gc

Das sollte es beheben.

Conal Trinitrotoluol Da Costa
quelle
0

Wenn Sie Git-Arbeitsbäume verwenden, stellen Sie sicher, dass Sie a

git worktree prune

vor dem Laufen

git gc

Ich hatte einen beschädigten Arbeitsbaum und dies schien den Trick zu tun, nachdem ich den beschädigten Arbeitsbaum entfernt hatte. git prunean sich schien nicht zu funktionieren.

JeffP
quelle
0

Die Ursache dafür war für mich die Arbeit in einem komprimierten Ordner unter Windows. Wenn der Ordner dekomprimiert wurde, wurden die Pack-Dateien beschädigt, wodurch andere seltsame Probleme auftraten, z. B. das Nicht-Bereinigen nicht vorhandener Zweige.

Die einzige Lösung bestand darin, das Arbeitsverzeichnis zu löschen und die Repo-Fernbedienung (en) erneut zu klonen. Zum Glück konnte ich immer noch Updates pushen und ziehen, um sicherzustellen, dass nichts verloren ging. Jetzt ist alles in Ordnung.

Will Strohl
quelle