it-swarm.com.de

Ignorieren Sie Dateien, die bereits an ein Git-Repository übergeben wurden

Ich habe ein bereits initialisiertes Git-Repository, zu dem ich eine .gitignore -Datei hinzugefügt habe. Wie kann ich den Dateiindex aktualisieren, damit die zu ignorierenden Dateien ignoriert werden?

2391
trobrock

Um eine einzelne Datei zu entfernen, die Ihrem Repository bereits hinzugefügt/initialisiert wurde, dh , stoppen Sie die Verfolgung der Datei, aber löschen Sie sie nicht von Ihrem System. Verwenden Sie: git rm --cached filename

So entfernen Sie jede Datei, die sich jetzt in Ihrem .gitignore befindet:

Übernehmen Sie zuerst alle ausstehenden Codeänderungen und führen Sie dann den folgenden Befehl aus:

git rm -r --cached .

Dadurch werden alle geänderten Dateien aus dem Index (Staging-Bereich) entfernt. Führen Sie dann einfach Folgendes aus:

git add .

Übernehmen Sie es:

git commit -m ".gitignore is now working"

Verwenden Sie git rm --cached filename, um git add filename rückgängig zu machen.

Stellen Sie sicher, dass Sie alle wichtigen Änderungen festschreiben, bevor Sie git add . ausführen. Andernfalls gehen alle Änderungen an anderen Dateien verloren.

3958
trobrock

Wenn Sie versuchen, Änderungen an einer Datei zu ignorieren, die bereits im Repository gespeichert ist (z. B. eine dev.properties-Datei, die Sie für Ihre lokale Umgebung ändern müssten, die Sie jedoch niemals einchecken möchten), möchten Sie diese Änderungen nicht ausführen ist:

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

Wenn Sie Änderungen erneut verfolgen möchten

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

Siehe git-update-index (1) Manual Page .

Schauen Sie sich auch die Optionen skip-worktree und no-skip-worktree für den Update-Index an, wenn Sie dies benötigen, um nach einem Git-Reset fortzufahren ( über )


Update: Da die Leute gefragt haben, finden Sie hier einen bequemen (und seit dem Kommentieren aktualisierten) Alias, mit dem Sie sehen können, welche Dateien in Ihrem lokalen Arbeitsbereich derzeit "ignoriert" werden (--assume-changed)

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
567
dyodji

Um die Verfolgung einer Datei aufzuheben, die bereits zu Ihrem Repository hinzugefügt/initialisiert wurde, dh die Verfolgung der Datei zu beenden, sie jedoch nicht von Ihrem System zu löschen, verwenden Sie: git rm --cached filename

356
pagetribe

Ja - .gitignore System ignoriert nur Dateien, die derzeit nicht der Versionskontrolle von Git unterliegen.

Das heißt Wenn Sie bereits eine Datei mit dem Namen test.txt mit git-add hinzugefügt haben, werden durch Hinzufügen von test.txt zu .gitignore weiterhin Änderungen an test.txt verfolgt.

Sie müssten zuerst git rm test.txt und diese Änderung festschreiben. Nur dann werden Änderungen an test.txt ignoriert.

81
Antony Stubbs

Leerzeichen in .gitignore entfernen

Stellen Sie außerdem sicher, dass in Ihrem .gitignore keine nachgestellten Leerzeichen enthalten sind. Ich bin auf diese Frage gekommen, weil ich nach einer Antwort gesucht habe. Dann hatte ich das komische Gefühl, ich sollte den Editor öffnen, anstatt nur .gitignore zu schreiben. Ein einzelnes Leerzeichen am Ende entfernt und poof es funktioniert jetzt :)

50
MikeJansen

ich folgte diesen Schritten

git rm -r --cached .
git add .
git reset HEAD

danach lösche git alle Dateien (* .swp in meinem Fall), die ignoriert werden sollten.

39
Orlando

Wenn Sie die Verfolgung der Datei beenden möchten, ohne die Datei von Ihrem lokalen System zu löschen, bevorzuge ich das Ignorieren der Datei config/database.yml. Einfach mal probieren:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

fügen Sie diese Datei nun zur Datei .gitignore hinzu und übernehmen Sie die Änderungen. Und von nun an werden Änderungen an config/database.yml von git nicht mehr nachverfolgt.

$ echo config/database.yml >> .gitignore

Vielen Dank

36
przbadu

Komplexe Antworten überall!

Verwenden Sie einfach Folgendes

git rm -r --cached .

Die zu ignorierenden Dateien werden von Origin und nicht vom Master auf Ihrem Computer entfernt!

Danach einfach festschreiben und pushen!

30
Ahmad Awais

So entfernen Sie nur einige bestimmte Dateien aus dem Tracking:

git update-index --assume-unchanged path/to/file

Wenn Sie jemals wieder damit beginnen möchten:

git update-index --no-assume-unchanged path/to/file                      
28
Mark Salvatore

Wie dav_i sagt, können Sie Folgendes verwenden, um die Datei in repo zu halten und sie dennoch aus den Änderungen zu entfernen, ohne ein zusätzliches Commit zu erstellen:

git update-index --assume-unchanged filename
27
Iman Mohamadi

Da ich nicht genau wusste, was der Befehl 'Antworten' tat, ließ ich ihn zu meinem Entsetzen laufen. Es entfernt rekursiv jede Datei aus Ihrem Git-Repo.

Stackoverflow zur Rettung ... Wie kann ein "git rm -r." Zurückgesetzt werden?

git reset HEAD

Hat den Trick gemacht, da ich lokale Dateien nicht festgeschrieben hatte, die ich nicht überschreiben wollte.

23
averydev

Keine der Antworten hat für mich funktioniert.

Stattdessen:

  1. Verschieben Sie die Datei aus dem git-kontrollierten Verzeichnis
  2. Überprüfen Sie die Entfernung in Git
  3. Verschieben Sie die Datei zurück in das git-kontrollierte Verzeichnis

Nachdem die Datei zurück verschoben wurde, wird sie von git ignoriert.

Funktioniert auch mit Verzeichnissen!

22
Hunter S

Es gibt vielleicht einen anderen Vorschlag für langsame Typen wie mich =) Lege die Datei . Gitignore in dein Repository-Stammverzeichnis nicht in den Ordner . Git. Prost!

22
Olga

ein weiteres Problem war, dass ich einen Inline-Kommentar hinterlassen habe.

tmp/*   # ignore my tmp folder (this doesn't work)

das funktioniert

# ignore my tmp folder
tmp/
19
kindahero

Wenn sich die Dateien bereits in der Versionskontrolle befinden, müssen Sie sie manuell entfernen.

18
Aragorn

Dank Ihrer Antwort konnte ich diesen kleinen Einzeiler schreiben, um ihn zu verbessern. Ich habe es auf meinem .gitignore und meinem Repo ausgeführt und hatte keine Probleme, aber wenn jemand auffällige Probleme sieht, kommentieren Sie dies bitte. Dies sollte git rm -r --cached von .gitignore sein:

cat $ (git rev-parse --show-toplevel)/sed "s // $ //" | grep -v "^ #" | xargs -L 1 -I {} find $ (git rev-parse --show-toplevel) -name "{}" | xargs -L 1 git rm -r - zwischengespeichert

Beachten Sie, dass Sie viel fatal: pathspec '<pathspec>' did not match any files erhalten. Das ist nur für die Dateien, die nicht geändert wurden.

12
umop

Ein anderes Problem, das hier nicht erwähnt wird, ist, dass wenn Sie Ihren .gitignore im Windows-Editor erstellt haben, es wie Kauderwelsch auf anderen Plattformen aussehen kann, wie ich herausgefunden habe. Der Schlüssel ist, um sicherzustellen, dass die Kodierung im Editor auf ANSI eingestellt ist (oder um die Datei unter Linux zu erstellen, wie ich es getan habe).

Aus meiner Antwort hier: https://stackoverflow.com/a/11451916/406592

9
Matt Parkins

Ich habe ein seltsames Problem mit .gitignore gefunden. Alles war in Ordnung und schien korrekt zu sein. Der einzige Grund, warum mein .gitignore "ignoriert" wurde, war, dass das Zeilenende im Mac-Format (\ r) war. Nach dem Speichern der Datei mit dem richtigen Zeilenende (in vi mit: set ff = unix) hat alles wie ein Zauber funktioniert!

9
Johannes Vetter

Auf meinem Server Linux Server (nicht wahr auf meinem lokalen Dev Mac) werden Verzeichnisse ignoriert, solange ich keinen Sternchen hinzufüge:

www/archives/*

Ich weiß nicht warum, aber es hat mich ein paar Stunden verlieren lassen, also wollte ich teilen ...

7
ndemoreau

Wenn Sie nicht mehr viele ignorierte Dateien verfolgen müssen, können Sie einige Befehle kombinieren:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

Dies würde die Verfolgung der ignorierten Dateien beenden. Wenn Sie Dateien tatsächlich aus dem Dateisystem entfernen möchten, verwenden Sie nicht die Option --cached. Sie können auch einen Ordner angeben, um die Suche einzuschränken, z.

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm

6
Etherealone

Eine Sache, die Sie auch beachten sollten, wenn .gitignore offenbar nicht verfolgte Dateien nicht ignoriert, ist, dass Sie keine Kommentare in derselben Zeile wie die Ignorierten haben sollten. Das ist also okay

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*

Aber das wird nicht funktionieren:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.

.gitignore interpretiert den letzteren Fall als "Dateien mit dem Namen "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc." ignorieren", was Sie natürlich nicht haben.

6
Gabriel Perdue