Ich habe eine Datei, die zuvor von Git verfolgt wurde, auf die .gitignore
aufführen. Die Datei wird jedoch weiterhin in angezeigt git status
nachdem es bearbeitet wurde. Wie zwinge ich Git, die Datei vollständig zu vergessen?
Wie kann ich Git dazu bringen, eine Datei zu vergessen, die verfolgt wurde, sich aber jetzt in .gitignore befindet?
Iwan
Matt Frear
Die folgende Befehlsfolge entfernt alle Elemente aus dem Git-Index (nicht aus dem Arbeitsverzeichnis oder lokalen Repository) und aktualisiert dann den Git-Index, wobei Git-Ignorierungen berücksichtigt werden. PS. Index = Cache
Zuerst:
git rm -r --cached .
git add .
Dann:
git commit -am "Remove ignored files"
Oder als Einzeiler:
git rm -r --cached . && git add . && git commit -am "Remove ignored files"
-
Um den Unterschied zwischen dieser Antwort und der akzeptierten hervorzuheben: Mit diesen Befehlen müssen Sie die betroffenen Dateien nicht wirklich kennen. (Stellen Sie sich ein temporäres Verzeichnis mit vielen zufälligen Dateien vor, die aus dem Index gelöscht werden sollten).
– Ludwig
27. März 2014 um 10:17 Uhr
-
Gleich wie die akzeptierte Antwort. Dateien werden gelöscht
git pull
.– Peter Peller
22. Mai 2014 um 16:07 Uhr
-
Es wäre schön, dies als Standard-Git-Befehl zu haben. Etwas wie
git rmignored
.– Berik
20. Dezember 2014 um 11:59 Uhr
-
@gudthing -r steht für “rekursiv”
– Markieren
15. Juli 2015 um 11:24 Uhr
-
Damit können Sie am Ende hinzufügen Sonstiges nutzlose Dateien, die derzeit nicht enthalten sind
.gitignore
. Das kann schwierig herauszufinden sein, je nachdem, wie laut Sie sindgit status
ist nach diesem Befehl. Ein Befehl, der nur entfernt neu ignorierte Dateien wären besser. Deshalb bevorzuge ich die Antwort von thSoft– KurzedMetal
22. September 2015 um 14:27 Uhr
-
Dies IST die wahre Antwort. Genial eigentlich, sehr einfach, verschmutzt nicht
git status
und eigentlich sehr intuitiv. Vielen Dank.– Pablo Olmos de Aguilera C.
12. Januar 2014 um 23:57 Uhr
-
git update-index --assume-unchanged <path> …
bewirkt, dass git Änderungen in den angegebenen Pfaden ignoriert, unabhängig davon.gitignore
. Wenn Sie von einer Remote ziehen und diese Remote Änderungen an diesem Pfad enthält, schlägt Git die Zusammenführung mit einem Konflikt fehl und Sie müssen manuell zusammenführen.git rm --cached <path> …
bewirkt, dass Git diesen Pfad nicht mehr verfolgt. Wenn Sie den Pfad nicht hinzufügen.gitignore
Sie werden den Weg in Zukunft sehengit status
. Die erste Option hat weniger Rauschen im Git-Commit-Verlauf und ermöglicht, dass Änderungen an der „ignorierten“ Datei in Zukunft verteilt werden.– ManicDee
25. Juni 2014 um 2:02 Uhr
-
Ich bin ziemlich verwirrt darüber, dass dies nicht die akzeptierte Antwort ist. Die akzeptierte Antwort hier beantwortet eindeutig nicht die eigentlich gestellte Frage. Diese Antwort ignoriert Änderungen an der Datei, die sich im Repository befindet, entfernt sie jedoch nicht aus dem Repository.
– David Cooper
2. Dezember 2015 um 22:46 Uhr
-
Diese Antwort wäre viel nützlicher, wenn sie genau erklären würde, was der angegebene Befehl tut, zB wie er sich von den anderen vorgeschlagenen Lösungen unterscheidet.
– LarsH
19. August 2016 um 15:39 Uhr
-
Dieser Befehl wird nur auf Ihrem Computer wirksam, oder? Was ist, wenn ich die Verfolgung der Datei auf allen Computern stoppen möchte? auch auf den maschinen, die den rep in zukunft klonen werden?
– George
30. Juli 2018 um 6:37 Uhr
thSoft
git ls-files -c --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"
Dies nimmt die Liste der ignorierten Dateien, entfernt sie aus dem Index und schreibt die Änderungen fest.
-
Wenn Sie sie auch aus dem Arbeitsverzeichnis entfernen müssen, führen Sie sie einfach aus
git ls-files --ignored --exclude-standard | xargs git rm
. Ich glaube, diese Antwort ist die beste! Weil es sehr klar ist, Unix-artig, und das Gewünschte auf direkte Weise erledigt, ohne die Nebeneffekte anderer, komplexerer Befehle zu erstellen.– imz – Ivan Zakharyaschev
27. Februar 2015 um 12:23 Uhr
-
Gute Antwort; Der Befehl schlägt jedoch fehl, wenn Sie Pfade mit Leerzeichen in der Mitte haben, z. B.: “My dir/my_ignored_file.txt”
– David H.
19. Juni 2015 um 15:29 Uhr
-
git ls-files –ignored –exclude-standard | sed ‘s/.*/”&”/’ | xargs git rm –cached
– David H.
19. Juni 2015 um 15:36 Uhr
-
git rm
werde mich beschweren, wennls-files
passte nichts zusammen. Verwendenxargs -r git rm ...
erzählenxargs
nicht zu laufengit rm
wenn keine Dateien übereinstimmen.–Wolfgang
6. Januar 2016 um 19:15 Uhr
-
Es wäre besser, \0 als Trennzeichen zu verwenden:
git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
– Nils-o-mat
2. Februar 2016 um 10:05 Uhr
Peter Mortensen
Verschiebe es, bestätige es und verschiebe es dann wieder hinein.
Dies hat in der Vergangenheit für mich funktioniert, aber es gibt wahrscheinlich einen “gittiereren” Weg, dies zu erreichen.
-
Wenn Sie sie auch aus dem Arbeitsverzeichnis entfernen müssen, führen Sie sie einfach aus
git ls-files --ignored --exclude-standard | xargs git rm
. Ich glaube, diese Antwort ist die beste! Weil es sehr klar ist, Unix-artig, und das Gewünschte auf direkte Weise erledigt, ohne die Nebeneffekte anderer, komplexerer Befehle zu erstellen.– imz – Ivan Zakharyaschev
27. Februar 2015 um 12:23 Uhr
-
Gute Antwort; Der Befehl schlägt jedoch fehl, wenn Sie Pfade mit Leerzeichen in der Mitte haben, z. B.: “My dir/my_ignored_file.txt”
– David H.
19. Juni 2015 um 15:29 Uhr
-
git ls-files –ignored –exclude-standard | sed ‘s/.*/”&”/’ | xargs git rm –cached
– David H.
19. Juni 2015 um 15:36 Uhr
-
git rm
werde mich beschweren, wennls-files
passte nichts zusammen. Verwendenxargs -r git rm ...
erzählenxargs
nicht zu laufengit rm
wenn keine Dateien übereinstimmen.–Wolfgang
6. Januar 2016 um 19:15 Uhr
-
Es wäre besser, \0 als Trennzeichen zu verwenden:
git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
– Nils-o-mat
2. Februar 2016 um 10:05 Uhr
Peter Mortensen
Ich verwende diesen Befehl immer, um diese nicht verfolgten Dateien zu entfernen. Einzeilige, saubere Ausgabe im Unix-Stil:
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
Es listet alle Ihre ignorierten Dateien auf, ersetzt jede Ausgabezeile durch eine Zeile in Anführungszeichen, anstatt Pfade mit Leerzeichen darin zu behandeln, und übergibt alles an git rm -r --cached
um die Pfade/Dateien/Verzeichnisse aus dem Index zu entfernen.
-
Tolle Lösung! Hat perfekt funktioniert und fühlt sich richtiger an, als alle Dateien zu entfernen und sie dann wieder hinzuzufügen.
– Jon Catmull
9. September 2015 um 8:59 Uhr
-
Auch ich fand das “sauberste”. Es mag offensichtlich sein, aber nur den ersten Teil auszuführen,
git ls-files --ignored --exclude-standard
allein lässt Sie zunächst verstehen/überprüfen, welche Dateien Ihre neue.gitignore
wird ausschließen/entfernen, bevor Sie fortfahren und das Finale ausführengit rm
.– JonBrave
29. Dezember 2015 um 11:56 Uhr
-
Seien Sie sich bewusst, schlägt bei Dateinamen mit bestimmten “bösen” Zeichen darin fehl, z
\n
. Ich habe meine Lösung gepostet, um dies zu berücksichtigen.– JonBrave
29. Dezember 2015 um 13:01 Uhr
-
Ein weiterer Vorbehalt: Beim Pullen wird die Datei in den Arbeitsverzeichnissen anderer gelöscht, richtig?
– LarsH
19. August 2016 um 15:46 Uhr
-
Git 2.32 brach das Verhalten von ls-Dateien – Sie müssen jetzt hinzufügen
-c
.– würdig
19. Oktober 2021 um 10:10 Uhr
git clean -X
klingt ähnlich, trifft aber in dieser Situation nicht zu (wenn die Dateien noch von Git verfolgt werden). Ich schreibe dies für alle, die nach einer Lösung suchen, um nicht dem falschen Weg zu folgen.– imz – Ivan Zakharyaschev
27. Februar 2015 um 12:14 Uhr
Die einzige wirkliche Antwort darauf ist unten, siehe
git update-index --assume-unchanged
. Diese Lösung 1) hält die Datei auf dem Server (Index), 2) ermöglicht es Ihnen, sie lokal frei zu ändern.– QWERTZ
4. Januar 2016 um 14:15 Uhr
Sie müssen verwenden
--skip-worktree
siehe: stackoverflow.com/questions/13630849/…– Doppelgänger
5. August 2016 um 20:33 Uhr
Eine wichtige Frage ist: Soll die Datei im Repository bleiben oder nicht? Wenn zB jemand das Repo neu klont, sollte er die Datei bekommen oder nicht? Wenn JAWOHL dann
git update-index --assume-unchanged <file>
korrekt ist und die Datei im Repository verbleibt und Änderungen nicht mit hinzugefügt werdengit add
. Wenn NEIN (zum Beispiel war es eine Cache-Datei, eine generierte Datei usw.), danngit rm --cached <file>
wird es aus dem Repository entfernen.– Martin
22. November 2016 um 10:45 Uhr
@Martin @Qwerty Jeder sollte aufhören, sich zu beraten
--assume-unchanged
Dies dient der Leistung, um zu verhindern, dass Git den Status großer nachverfolgter Dateien überprüft, es jedoch vorzieht--skip-worktree
Dies ist für modifizierte nachverfolgte Dateien, die der Benutzer nicht mehr festschreiben möchte. Siehe stackoverflow.com/questions/13630849/…– Philipp
15. Februar 2018 um 11:16 Uhr