682 Stimmen

Wie entfernt man Dateien, die in .gitignore aufgeführt sind, aber noch im Repository vorhanden sind?

Ich habe einige Dateien in meinem Repository, die ignoriert werden sollten, ich habe sie zu .gitignore hinzugefügt, aber natürlich werden sie nicht aus meinem Repository entfernt.

Meine Frage ist also, ob es einen magischen Befehl oder ein Skript gibt, das mit filter-branch meinen Verlauf umschreibt und alle diese Dateien einfach entfernt? Oder einfach einen Befehl, der einen Commit erstellt, der sie entfernt?

791voto

Samy Dindane Punkte 17374

Sie können sie manuell aus dem Repository entfernen:

git rm --cached file1 file2 dir/file3

Oder, wenn Sie viele Dateien haben:

git rm --cached `git ls-files -i -c --exclude-from=.gitignore`

Aber das scheint in Git Bash unter Windows nicht zu funktionieren. Es erzeugt eine Fehlermeldung. Das Folgende funktioniert besser:

git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached  

In PowerShell unter Windows funktioniert dies sogar noch besser (behandelt Leerzeichen in Pfad- und Dateinamen):

git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}

Was das Umschreiben der gesamten Geschichte ohne diese Dateien betrifft, so bezweifle ich sehr, dass es eine automatisch Weise zu tun.
Und wir alle wissen, dass es schlecht ist, die Geschichte umzuschreiben, nicht wahr? :)

683voto

gtatr Punkte 6687

Eine einfachere Methode, die unabhängig vom Betriebssystem funktioniert, ist die folgende

git rm -r --cached .
git add .
git commit -m "Drop files from .gitignore"

Sie entfernen grundsätzlich alle Dateien und fügen sie wieder hinzu, aber git add ignoriert die Einträge in .gitignore .

Die Verwendung des --cached behält die Dateien in Ihrem Dateisystem, so dass Sie keine Dateien von Ihrer Festplatte löschen.

Anmerkung: In den Kommentaren wurde darauf hingewiesen, dass Sie den Verlauf aller Ihrer Dateien verlieren werden. Ich habe dies mit git 2.27.0 auf MacOS getestet und es ist no den Fall. Wenn Sie überprüfen möchten, was passiert, prüfen Sie Ihre git diff HEAD~1 bevor Sie Ihren Commit ausführen.

219voto

weiz Punkte 2881

Da die Dateien in .gitignore nicht nachverfolgt werden, können Sie die Korkenzieher um Dateien, die nicht unter Versionskontrolle stehen, rekursiv zu entfernen.

Verwenden Sie git clean -xdn um einen Probelauf durchzuführen und zu sehen, was entfernt wird.
Dann verwenden Sie git clean -xdf um sie auszuführen.

Im Grunde genommen, git clean -h o man git-clean (unter Unix) wird Ihnen helfen.

Beachten Sie, dass dieser Befehl auch die neue Dateien die sich nicht in der Bereitstellungszone befinden.

9voto

Scott Crossen Punkte 931

Ich habe eine sehr einfache Lösung gefunden, indem ich die Ausgabe der .gitignore-Anweisung mit sed manipuliert habe:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Erläuterung:

  1. die .gitignore-Datei drucken
  2. alle Kommentare aus dem Ausdruck entfernen
  3. alle Leerzeilen löschen
  4. Fügen Sie "git rm -r" an den Anfang der Zeile an
  5. jede Zeile ausführen.

6voto

git rm --cached -r . um alle zwischengespeicherten rekursiv zu entfernen

git add . um alle nicht in .gitignore enthaltenen Dateien hinzuzufügen

müssen Sie einige gelöschte Dateien übertragen, die nicht wirklich im Dateisystem gelöscht sind

Mit einem einzigen Befehl wird es git rm --cached -r . && git add .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X