Anwenden von .gitignore auf festgeschriebene Dateien

436

Ich habe viele Dateien festgeschrieben, die ich jetzt ignorieren möchte. Wie kann ich git anweisen, diese Dateien jetzt bei zukünftigen Commits zu ignorieren?

EDIT: Ich möchte sie auch aus dem Repository entfernen. Dies sind Dateien, die nach dem Erstellen oder zur Unterstützung benutzerspezifischer Tools erstellt wurden.

user880954
quelle
1
Mögliches Duplikat der .gitignore-Datei nicht ignoriert
Wooble
8
@Wooble Die Antwort mag ähnlich sein, aber diese Frage beschreibt genau das Problem, mit dem ich konfrontiert war und das ich lösen musste.
rjmunro
1
Dies ist die Antwort, die die Titelfrage
kayleeFrye_onDeck

Antworten:

471
  1. Bearbeiten Sie .gitignore, um der Datei zu entsprechen, die Sie ignorieren möchten
  2. git rm --cached /path/to/file

Siehe auch:

Matt Ball
quelle
12
Es gibt jedoch viele Dateien. Ich möchte dies nicht für jeden einzelnen tun müssen
user880954
1
Befinden sich die Dateien in gemeinsamen Verzeichnissen? Wenn nicht, reduziert sich das Problem auf eine Shell-Verwendungsfrage, nicht auf eine Git-Frage.
Matt Ball
12
Es muss einen Modus "Ich habe vergessen, meinen .gitignore bis nach meinem ersten Festschreiben hinzuzufügen" geben.
Luke Puplett
9
Die Antwort ist unter dieser.
Einseitig
3
Ich wurde gebeten, flag -r hinzuzufügen, um dies zu tun.
Vishal Gulati
599

Nach dem Bearbeiten .gitignore, um die ignorierten Dateien abzugleichen, können Sie git ls-files -ci --exclude-standarddie Dateien anzeigen, die in den Ausschlusslisten enthalten sind. Sie können dann tun

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

um sie aus dem Repository zu entfernen (ohne sie von der Festplatte zu löschen).

Bearbeiten : Sie können dies auch als Alias ​​in Ihre .gitconfig-Datei einfügen, damit Sie es jederzeit ausführen können. Fügen Sie einfach die folgende Zeile unter dem Abschnitt [Alias] hinzu (ändern Sie sie nach Bedarf für Windows oder Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(Das -rFlag in xargsverhindert git rm, dass ein leeres Ergebnis ausgeführt und seine Verwendungsnachricht ausgedruckt wird, wird jedoch möglicherweise nur von GNU findutils unterstützt. Andere Versionen vonxargs möglicherweise eine ähnliche Option oder nicht.)

Jetzt können Sie einfach git apply-gitignoreIhr Repo eingeben und es erledigt die Arbeit für Sie!

Jonathan Callen
quelle
10
Ich denke, xargs für Mac hat kein -r ... oder meins ist fehlerhaft / alt, ich weiß nicht ... und warum das !vor git? na ja ... meins hat als gearbeitet alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino
18
Unter Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett
Dadurch wurden nur meine .gitignore-Dateien entfernt, nicht die Dateien, die ich ignorieren wollte und die in den .gitignore-Dateien aufgeführt waren - war das der Punkt?
Hippyjim
@Hippyjim Wenn die Dateien bereits festgeschrieben sind (obwohl sie in .gitignore aufgeführt waren) und .gitignore noch nicht festgeschrieben ist, ist dies das erwartete Ergebnis. Andernfalls bin ich mir nicht sicher, was in Ihrem Fall vor sich geht.
Jonathan Callen
1
Für Mac-Benutzer -rist dies Standard und wird von BSD-Versionen nicht akzeptiert. Also entfernen -r.
Weishi Zeng
136

So lassen Sie die Datei im Repo, ignorieren aber zukünftige Änderungen:

git update-index --assume-unchanged <file>

und um dies rückgängig zu machen:

git update-index --no-assume-unchanged <file>

Um herauszufinden, welche Dateien auf diese Weise eingestellt wurden:

git ls-files -v|grep '^h'

Gutschrift für die ursprüngliche Antwort auf http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

ben.tiberius.avery
quelle
1
Chronial hat eine gute Antwort, um dies rekursiv für ein Verzeichnis zu tun: stackoverflow.com/a/16346756/1101076
jordan314
Ich wollte eine IDE-Konfiguration festschreiben, aber keine unnötigen Änderungen daran verfolgen. Dies funktioniert, obwohl ich nicht sicher bin, ob es für andere funktioniert, die das Repository auschecken. Es kann mit kombiniert werden, git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedwenn das hilft.
Dlamblin
7
Dies ist die einzige Antwort, die genau das tut, was die Titelfrage verlangt. PERFEKT! Die meisten dieser anderen Antworten haben unnötig mit Dateien herumgespielt.
KayleeFrye_onDeck
1
Dies ist die genau richtige Antwort auf die Frage. Wenn Sie Befehle wie verwenden, git rm --cachedwird die Datei im Repository entfernt, was nicht den Anforderungen des Quizzers entspricht. Vielen Dank. Ich weiß das wirklich zu schätzen. Ihre Antwort hilft mir sehr.
Ramwin
88

Stellen Sie sicher, dass Ihr aktuelles Repo die neueste Version ist

  1. Bearbeiten .gitignoreSie nach Ihren Wünschen
  2. git rm -r --cached .
  3. git add .

dann wie gewohnt festschreiben

Théo Attali
quelle
14
Dies sollte die akzeptierte Antwort sein, da in der Frage ausdrücklich angegeben wurde, dass viele Dateien entfernt werden müssen.
Nbeuchat
3
Beachten Sie, dass Schritt 2 dies eine Weile dauern kann, wenn Sie über ein großes Repository verfügen.
Brainbag
Dies führte nur zum Entfernen aller Dateien aus dem Index! Dies rettete mich: git reset HEAD(Denken Sie daran, alle Änderungen zu verstauen)
aksh1618
2
Schritt 2 entfernt alles, ja, aber Schritt 3 sollte sie alle lesen, mit Ausnahme derjenigen, die aufgrund von .gitignore fehlschlagen.
Ojchase
11

Alte Frage, aber einige von uns sind in git-posh(Powershell). Dies ist die Lösung dafür:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
Chris Pfohl
quelle
0

Folge diesen Schritten:

  1. Pfad zur gitignoreDatei hinzufügen

  2. Führen Sie diesen Befehl aus

    git rm -r --cached foldername
    
  3. Änderungen wie gewohnt festschreiben.

Kalyan Chakravarthi V.
quelle