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


Ich habe versehentlich einen Ordner mit Bildern hinzugefügt und zugesagt. Dann machte ich noch einen Commit. Dann habe ich diese Dateien mit entfernt git rm -f ./images und wieder verpflichtet.

Gerade jetzt habe ich in diesem Zweig viel mehr Commits gemacht (Master). In meinem Kopf habe ich das nicht ./static/images Mappe.

Aus diesem Grund hat meine Repo-Größe stark zugenommen. Wie kann ich diese Blobs vollständig entfernen? Und ich möchte es auch von meinem Remote-GitHub-Repo entfernen.


76
2018-04-06 08:36


Ursprung


Antworten:


Folgendes suchen Sie: 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

Um alle gelöschten Dateien aus Caches zu entfernen, die git erstellt, verwenden Sie:

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

Sie können hier mehr Informationen über den letzten Befehl sowie ein Skript finden, das alles in einer einzigen Aktion ausführt: Git: für immer Dateien oder Ordner aus dem Verlauf entfernen.

Ein weiterer Link mit vielen Erklärungen: Entfernen Sie vertrauliche Daten.

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

(Befehle kopiert von natacadoAntwort in der oben verlinkten Frage.) Wenn Sie die Dateien bereits aus der Arbeitskopie entfernt haben, sollte folgendes funktionieren. Ermitteln Sie den Hash für das Commit, mit dem die unerwünschten Dateien hinzugefügt wurden. 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
2018-04-06 08:39



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

git rebase -i master

Sie erhalten eine Liste der 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 baumelnden Commits werden dann im Verlauf der natürlichen Git-Müllsammlung gesäubert, ein Prozess, den Sie mit dem Befehl in Darhuuks Antwort erzwingen können.

Bearbeiten: Dies funktioniert auch, wenn Sie zu einem Remote-Repository verschoben haben, aber Sie müssen mit --force schieben. (Gleiches gilt für die git filter-branch Lösung).

Beachten Sie, dass dies für jeden, der aus Ihrem Zweig gezogen hat, sehr ärgerlich ist. Sie sollten sich beraten lassen "Erholung von Upstream-Rebase".


Vermutlich ist Ihre ursprüngliche versehentliche Hinzufügung von Bildern Teil einer Verpflichtung, die Sie behalten möchten. In diesem Fall müssen Sie das Commit während der Rebase bearbeiten, um die Teile, die Sie behalten möchten, aufzuteilen. 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 wird hier beendet und Sie können das Commit mit "git commit --amend" teilen.


9
2018-04-06 11:17



Ich wiederhole im Wesentlichen die Antwort damit verbunden Windows-Formatierungseinschränkung, nur damit es als Kommentar nicht verloren geht.

Beachten Sie die Verwendung von doppelten Anführungszeichen statt einfachen Anführungszeichen, da dies von der Shell abhängt, die Sie beim Analysieren von Zeichenfolgen verwenden.

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
2017-10-03 14:03