Wie kann ich Git dazu bringen, eine Datei zu vergessen, die verfolgt wurde, sich aber jetzt in .gitignore befindet?

Lesezeit: 7 Minuten

Benutzer-Avatar
Iwan

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?

  • 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-worktreesiehe: 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 werden git add. Wenn NEIN (zum Beispiel war es eine Cache-Datei, eine generierte Datei usw.), dann git 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

Benutzer-Avatar
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 sind git 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 sehen git 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

Benutzer-Avatar
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, wenn ls-files passte nichts zusammen. Verwenden xargs -r git rm ... erzählen xargs nicht zu laufen git 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

Benutzer-Avatar
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, wenn ls-files passte nichts zusammen. Verwenden xargs -r git rm ... erzählen xargs nicht zu laufen git 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

Benutzer-Avatar
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-standardallein lässt Sie zunächst verstehen/überprüfen, welche Dateien Ihre neue .gitignore wird ausschließen/entfernen, bevor Sie fortfahren und das Finale ausführen git 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

1331940cookie-checkWie kann ich Git dazu bringen, eine Datei zu vergessen, die verfolgt wurde, sich aber jetzt in .gitignore befindet?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy