webentwicklung-frage-antwort-db.com.de

Entfernen Sie Dateien vollständig von Git Repo und Remote auf GitHub

Ich habe versehentlich einen Ordner mit Bildern hinzugefügt und festgeschrieben. Dann machte ich noch ein Commit. Dann habe ich diese Dateien mit git rm -f ./images Entfernt und erneut festgeschrieben.

Im Moment habe ich in diesem Zweig (Master) viel mehr Commits gemacht. In meinem HEAD habe ich diesen Ordner ./static/images Nicht.

Aus diesem Grund hat sich meine Repo-Größe sehr vergrößert. Wie kann ich diese Blobs vollständig entfernen? Und ich möchte es auch von meinem entfernten GitHub-Repo entfernen.

76

Dies ist, was Sie suchen: Ignorieren entfernt keine Datei . Ich schlage vor, Sie lesen diese Seite, aber hier ist der spezifische Befehl zu verwenden:

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Verwenden Sie außerdem Folgendes, um alle gelöschten Dateien aus den von git erstellten Caches zu entfernen:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --Prune

Weitere Informationen zum letzten Befehl sowie ein Skript, das alles in einer einzigen Aktion erledigt, finden Sie hier: git: Dateien oder Ordner für immer aus dem Verlauf entfernen .

Weitere Links mit vielen Erklärungen: Vertrauliche Daten entfernen .

[Bearbeiten] Siehe auch diese StackOverflow-Frage: Entfernen Sie vertrauliche Dateien und ihre Commits aus dem Git-Verlauf .

(Befehle, die aus der Antwort von natacado in der oben verlinkten Frage kopiert wurden.) Wenn Sie die Dateien bereits aus der Arbeitskopie entfernt haben, sollte Folgendes funktionieren. Finden Sie den Hash für das Commit heraus, das die unerwünschten Dateien hinzugefügt hat. Dann mach:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git Push --force --verbose --dry-run
git Push --force
124
Darhuuk

Sie könnten einfach Ihren gesamten Zweig neu strukturieren und sowohl das Commit entfernen, durch das die Bilder hinzugefügt wurden, als auch das Commit, durch das sie entfernt wurden.

git rebase -i master

Sie erhalten eine Liste mit Commits. Löschen Sie die Zeilen mit den Rogue-Commits, die Sie entfernen möchten. ("dd" löscht eine Zeile in vim, dem Standardeditor. Dann mit ZZ speichern)

Die Dangling Commits werden dann im Zuge der Sammlung von natürlichem Müll bereinigt, ein Vorgang, den Sie mit dem in Darhuuks Antwort angegebenen Befehl erzwingen können.

Bearbeiten: Dies funktioniert auch, wenn Sie auf ein Remote-Repository gepusht haben, aber Sie müssen mit --force pushen. (Gleiches gilt für die Git-Filter-Branch-Lösung).

Beachten Sie, dass dies für jeden, der aus Ihrer Filiale gezogen hat, sehr ärgerlich ist. Sie sollten konsultieren "Wiederherstellung von Upstream-Rebase" .


Vermutlich ist Ihre ursprüngliche versehentliche Hinzufügung von Bildern Teil eines Commits, das Sie behalten möchten. In diesem Fall müssen Sie das Commit während des Rebases bearbeiten, um die Teile aufzuteilen, die Sie behalten möchten. Sie können dies tun, indem Sie "pick" in der Liste "rebase -i" für dieses Commit durch "e" (zum Bearbeiten) ersetzen. Der Rebase-Prozess stoppt hier und Sie können das Commit mit "git commit --amend" aufteilen.

9
RJFalconer

Ich wiederhole im Wesentlichen die Antwort in Kombination mit Vorbehalt zur Windows-Formatierung , nur damit es nicht als Kommentar verloren geht.

Beachten Sie die Verwendung von doppelten Anführungszeichen anstelle von einfachen Anführungszeichen, da dies von der Shell abhängt, mit der Sie Zeichenfolgen analysieren.

Einzelne Zeile:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Mehrere Zeilen:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
3
drzaus