Das Löschen der Datei aus dem Git-Repo ist fehlgeschlagen und es konnte keine neue Sicherung erstellt werden

116

Ich habe versucht, eine Datei aus meinem Remote-Repo zu entfernen, indem ich Folgendes ausgeführt habe:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

Aber Git beschwert sich darüber

Es kann kein neues Backup erstellt werden. Eine frühere Sicherung ist bereits in refs / original /
Force vorhanden. Überschreiben der Sicherung mit -f
rm: /.git-rewrite/backup-refs kann nicht entfernt werden: Berechtigung verweigert
rm: Verzeichnis kann nicht entfernt werden /.git-rewrite: Verzeichnis nicht leer

Dies geschah, nachdem ich das Verzeichnis .git-rewrite unter Windows bereits gelöscht hatte.

Wie kann ich diese Datei entfernen? Es ist eine 29-MB-Datei, die sich auf meinem Repo befindet, daher muss ich die Datei unbedingt entfernen.

Ich habe versucht, das Commit in zu löschen git rebase -i, aber anscheinend, weil das Commit viele verschiedene Dateien berührt hat, beschwert sich Git über Konflikte und ich habe aus Sicherheitsgründen abgebrochen.

Cardin Lee JH
quelle
1
Für Suchmaschinen: Dies kann auch gelten, wenn Ihre Fehlermeldung lautet .git-rewrite already exists, please remove it.
Drew Noakes

Antworten:

218

Sie haben bereits eine Filterverzweigungsoperation ausgeführt. Nach der Filterverzweigung behält Git die Refs zu den alten Commits bei, falls etwas schief geht.

Sie finden diese in .git/refs/original/…. Löschen Sie entweder dieses Verzeichnis und alle darin enthaltenen Dateien oder verwenden Sie das -fFlag, um Git zu zwingen, die alten Referenzen zu löschen.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
stricken
quelle
10
Endlich hat es funktioniert, danke! Ich habe das Flag -f ausprobiert, aber das Problem war, dass ich es am Ende des Befehls gesetzt habe, z. KOPF -f. Als ich Ihren Befehl sah, versuchte ich, die Flagge am Anfang zu setzen, und es funktionierte! = D
Cardin Lee JH
12
Optionsflags ( -f) stehen vor refs ( HEAD). refs gehen zuletzt
knittl
Nach dem Hinzufügen von -f UND dem Löschen des Verzeichnisses wird immer noch der gleiche Fehler angezeigt. Irgendwelche Ideen?
Yaron
1
@knittl, ich bezog mich nicht auf git add. Ich habe den gleichen Fehler wie das Originalposter erhalten, auch nachdem ich den .git/refs/original/Ordner gelöscht und das -fFlag im git filter-branchBefehl verwendet habe. In meinem Fall bestand die Lösung darin, die .git/packed-refsDatei zu löschen .
Yaron
1
@knittl, ich fand, wie man es behebt, fand aber nicht, was das Problem war. Grundsätzlich habe ich --ignore-unmatchBefehl hinzugefügt git rmund es lief reibungslos!
Gabrielius
21

Verwenden Sie diesen Befehl, um die ursprüngliche Sicherung zu entfernen:

git update-ref -d refs/original/refs/heads/master

Hier ist das Wesentliche, mit dem ich mein Git-Repo gefiltert habe: https://gist.github.com/k06a/25a0214c98bc19fd6817

k06a
quelle
Dies ist die richtige Lösung, um das Backup zu entfernen! Das Löschen .git/refs/original/löst das Problem nicht.
Erik Koopmans
Stellen Sie sicher, dass Sie "Master" in den Zweig ändern, den Sie reparieren möchten. In meinem Fall "Entwickeln"
Damian Green,
git show-ref | awk '/ refs.original.refs/{print$2}'um alle Backups zu finden, die Ihr Repo hat.
Dan
4

Ich hatte das gleiche Problem und die obige Antwort hat es nicht behoben. Es war kein .git / refs / original / -Verzeichnis mehr vorhanden. Die Lösung für mich war, die .git / packed-refs-Datei zu löschen.

Yaron
quelle
Gleiches Problem. Keine .git/packed-refsDatei und kein Ordner originalin .git/refs. Jemand?
XedinUnknown
Hier durch Hinzufügen des -rFlags zum Befehl behoben .
XedinUnknown
Selbes Problem hier. Das Löschen von gepackten Refs löste das Problem, ruinierte aber auch den Rest meines Git-Verzeichnisses und ich musste aus dem Backup wiederherstellen.
Kevin Yin
2

Fügen Sie dem Filterfilterbefehl eine Kraft hinzu.

Adam Dymitruk
quelle