Ich gehe davon aus, dass Sie eine Fernbedienung haben, auf die alle relevanten Änderungen bereits übertragen wurden. Ich habe mich nicht um lokale Änderungen gekümmert und wollte einfach nur vermeiden, ein großes Repository zu löschen und neu zu klonen. Wenn Sie wichtige lokale Änderungen haben, sollten Sie vielleicht etwas vorsichtiger sein.
Ich hatte das gleiche Problem, nachdem mein Laptop abgestürzt war. Wahrscheinlich, weil es sich um ein großes Repository handelte, hatte ich ziemlich viele beschädigte Objektdateien, die nur einzeln beim Aufruf von git fsck --full
Deshalb habe ich einen kleinen Shell-Einzeiler geschrieben, um einen von ihnen automatisch zu löschen:
$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`
2>&1
leitet die Fehlermeldung auf die Standardausgabe um, damit man grep es
- grep verwendeten Optionen:
-o
gibt nur den Teil einer Zeile zurück, der tatsächlich übereinstimmt
-E
ermöglicht erweiterte reguläre Ausdrücke
-m 1
sicherstellen, dass nur der erste Treffer zurückgegeben wird
[0-9a-f]{2}
passt auf jedes der Zeichen zwischen 0 und 9 und a und f, wenn zwei davon zusammen vorkommen
[0-9a-f]*
passt auf eine beliebige Anzahl von Zeichen zwischen 0 und 9 sowie a und f, die zusammen auftreten
Es wird immer nur eine Datei auf einmal gelöscht, so dass Sie es vielleicht in einer Schleife aufrufen sollten:
$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done
Das Problem dabei ist, dass er nichts Nützliches mehr ausgibt, so dass man nicht weiß, wann er fertig ist (er sollte einfach nach einiger Zeit nichts Nützliches mehr tun).
Um dies zu "beheben", habe ich dann einfach einen Aufruf von git fsck --full
nach jeder Runde wie folgt: $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done
Er ist jetzt etwa halb so schnell, aber er gibt seinen "Zustand" aus.
Danach habe ich ein wenig mit den Vorschlägen in den Antworten hier herumgespielt und bin schließlich zu einem Punkt gekommen, an dem ich git stash
y git stash drop
viel von dem kaputten Zeug.
Erstes Problem gelöst
Danach hatte ich immer noch das folgende Problem: unable to resolve reference 'refs/remotes/origin/$branch': reference broken
die gelöst werden könnten durch $ rm \repo.git\refs\remotes\origin$branch
$ git fetch
Ich habe dann eine $ git gc --prune=now
$ git remote prune origin
zur Sicherheit und
git reflog expire --stale-fix --all
um loszuwerden error: HEAD: invalid reflog entry $blubb
beim Laufen git fsck --full
.