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?
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.
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:]]"
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
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.
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 :)
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.
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
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!
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
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
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.
Keine der Antworten hat für mich funktioniert.
Stattdessen:
Nachdem die Datei zurück verschoben wurde, wird sie von git ignoriert.
Funktioniert auch mit Verzeichnissen!
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!
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/
Wenn sich die Dateien bereits in der Versionskontrolle befinden, müssen Sie sie manuell entfernen.
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.
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
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!
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 ...
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
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.