Wie kann ich eine Datei vollständig aus einem Git-Repository entfernen?

78

Ich habe kürzlich festgestellt, dass die Projektdateien, die meine Texteditoren (zusammen mit etwas anderem Junk) verwenden, dem Git-Repository für das Projekt hinzugefügt wurden. Da sie eigentlich nicht Teil des Projekts sind, möchte ich sie entfernen, aber git rmdie alten Versionen werden nicht aus dem Repository entfernt, und ich konnte nichts anderes finden, das vielversprechend aussieht.

David X.
quelle
5
Teilduplikat , definitiv abgedeckt durch vorherige Fragen: stackoverflow.com/questions/307828/… stackoverflow.com/questions/1216733/…
Cascabel

Antworten:

140

Das gewünschte Werkzeug ist git filter-branch. Seine Verwendung wird hier beschrieben , aber im Grunde:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD

entfernt "my_file" aus jedem Commit.

Beachten Sie, dass dies jedes Commit neu schreibt. Wenn Sie also in ein Remote-Repository pushen, müssen Sie (a) das Update erzwingen, und (b) alle anderen, die von Ihnen gezogen haben, haben jetzt doppelte Commits (da Sie den Verlauf neu geschrieben haben) auf der git rebaseManpage beschrieben .

Mipadi
quelle
19
Ich empfehle das Hinzufügen, --prune-emptydamit auch alle daraus resultierenden leeren Commits entfernt werden.
fnkr
Wie funktioniert dies in einem Repository mit vielen Dateien mit demselben Namen in verschiedenen Verzeichnissen? Löscht es alle Dateien mit demselben Namen?
2
@CodeMonkey: In diesem Fall würden Sie einen längeren, eindeutigen Pfad verwenden.
Mipadi
1
später sollte ich tun git push --force? @mipadi
alper
1
@mipadi, was ist, wenn ich diese Dateien vor langer Zeit lokal gelöscht habe? (und diese Löschungen festgeschrieben und gepusht) Wie kann ich in diesem Fall die Dateien aus dem Repository löschen?
Mannyglover
11

Dies ist der Zweck git filter-branch, aber achten Sie darauf, dass sich Ihr Repo-Verlauf ändert und die Commit-Hashes nach dem Umschreiben des Verlaufs anders sind.

Wenn Sie auch den Speicherplatz freigeben möchten, empfehle ich die Verwendung git forget-blob, da git filter-branchGit Ihre Datei allein nicht vergisst, da sie möglicherweise weiterhin von Fernbedienungen, Reflogs, Tags und dergleichen referenziert wird.

git forget-blob main.c.swp

Weitere Informationen erhalten Sie hier

Nachoparker
quelle