429 Stimmen

git zeigt Dateien nach dem Hinzufügen zu .gitignore immer noch als geändert an

Ich füge dies hinzu zu .gitignore ファイル

.idea/*

aber wie auch immer der Status ist:

#       modified:   .gitignore
#       modified:   .idea/.generators
#       modified:   .idea/dovezu.iml
#       modified:   .idea/misc.xml
#       modified:   .idea/workspace.xml

Was mache ich falsch? Ich habe sogar .idea/* zu den globalen ~/.gitignore_global aber der Git-Status zeigt mich trotzdem an:

#       modified:   .gitignore
#       modified:   .idea/.generators
#       modified:   .idea/dovezu.iml
#       modified:   .idea/misc.xml
#       modified:   .idea/workspace.xml

665voto

mcls Punkte 8243

Ihr .gitignore funktioniert, aber die Dateien werden immer noch verfolgt, weil sie bereits im Index waren.

Um dies zu verhindern, müssen Sie Folgendes tun: git rm -r --cached .idea/

Wenn Sie die .idea/ Verzeichnis wird aus Ihrem Git-Repository entfernt und die folgenden Übertragungen ignorieren die .idea/ Verzeichnis.

PS: Sie könnten Folgendes verwenden .idea/ anstelle von .idea/* um ein Verzeichnis zu ignorieren. Weitere Informationen über die Muster finden Sie unter die .gitignore Manpage .


Hilfreiches Zitat aus dem git-rm Manpage

--cached
    Use this option to unstage and remove paths only from the index. 
    Working tree files, whether modified or not, will be left alone.

149voto

Sidhanshu_ Punkte 1528

Diejenigen, die vielleicht noch auf der Suche nach diesem Thema sind, sollten sich nur diese Seite ansehen.

Auf diese Weise können Sie zwischengespeicherte Indexdateien entfernen und dann nur die Dateien hinzufügen, die Sie benötigen. .gitignore Datei.

1. git rm -r --cached .
2. git add .
3. git commit -m 'Removing ignored files'

Hier ist ein wenig mehr Information.

  1. Mit diesem Befehl werden alle zwischengespeicherten Dateien aus dem Index entfernt.
  2. Dieser Befehl fügt alle Dateien hinzu, außer denen, die in gitignore .
  3. Dieser Befehl überträgt Ihre Dateien erneut und entfernt die Dateien, die Git ignorieren soll, behält sie aber in Ihrem lokalen Verzeichnis.

31voto

RRE Designs Punkte 149

Verwendung von git rm --cached *file* funktioniert bei mir nicht (ich weiß, dass diese Frage schon 8 Jahre alt ist, aber sie wird immer noch ganz oben in der Suche nach diesem Thema angezeigt), es wird zwar die Datei aus dem Index entfernt, aber auch die Datei aus dem Remote gelöscht.

Ich habe keine Ahnung, warum das so ist. Alles, was ich wollte, war meine lokale Konfiguration isoliert zu halten (sonst musste ich die localhost base url vor jeder Übergabe kommentieren), nicht das entfernte Äquivalent zu config löschen.

Bei weiterer Lektüre bin ich auf Folgendes gestoßen die richtige Art und Weise, dies zu tun und die einzige Möglichkeit, die meinen Anforderungen entsprach, obwohl sie mehr Aufmerksamkeit erfordert, vor allem bei Zusammenführungen.

Wie auch immer, alles was es braucht ist git update-index --assume-unchanged *path/to/file* .

Soweit ich weiß, ist dies der wichtigste Punkt, den es zu beachten gilt:

Git scheitert (gnädigerweise), wenn es diese Datei im Index ändern muss, z.B. beim Einbinden eines Commits; wenn also die angenommene, nicht nachverfolgte Datei stromaufwärts geändert wird, müssen Sie die Situation manuell handhaben.

10voto

Serge Stroobandt Punkte 23731

update-index --skip-worktree

Das Besondere git Option zu ignorieren. Konfigurationsdateien ist:

$ git update-index --skip-worktree <filepath>

Es ist zu beachten, dass es keine Notwendigkeit, etwas hinzuzufügen zu .gitignore .

Abbrechen dies, wenn sich beispielsweise die generische Struktur einer Konfigurationsdatei geändert hat:

$ git update-index --no-skip-worktree <filepath>

--skip-worktree wird verwendet, um zu instruieren git eine Datei-Änderung nie auf eine bestimmte Datei zu indizieren. Dies könnte daran liegen, dass Entwickler die Datei normalerweise lokal ändern müssen, um das Projekt zu testen. Zum Beispiel, wenn das Haupt-Repository eine produktionsreife Konfigurationsdatei enthält und versehentliche Commit-Änderungen an dieser Datei verhindert werden sollen.

. --assume-unchanged geht davon aus, dass ein Entwickler diese Datei niemals ändern sollte. Dieses Flag ist nur für die Verbesserung der Leistung von git in Bezug auf sich nie ändernde Ordner wie Software Development Kit (SDK)-Komponenten.

6voto

kiloton Punkte 95

Die hier und an anderen Stellen angebotenen Lösungen haben bei mir nicht funktioniert, also werde ich die Diskussion für künftige Leser fortsetzen. Zugegebenermaßen verstehe ich das Verfahren noch nicht ganz, aber ich habe mein (ähnliches) Problem endlich gelöst und möchte es mit anderen teilen.

Ich hatte bei der Arbeit mit Git in IntelliJ IDEA auf Windows 10 versehentlich einige Doc-Verzeichnisse mit mehreren hundert Dateien zwischengespeichert, und nachdem ich sie zu .gitignore (und wahrscheinlich auch ein bisschen herumgeschoben) konnte ich sie nicht aus der Standard-Changeliste entfernen.

Ich habe erst die Änderungen, die ich vorgenommen hatte, übertragen und dann das Problem gelöst - das hat viel zu lange gedauert. Ich habe versucht git rm -r --cached . würde aber immer path-spec ERRORS, mit verschiedenen Varianten der path-spec sowie mit dem -f et -r Flaggen.

git status immer noch die Dateinamen anzeigen würde, also habe ich versucht, einige davon wortwörtlich mit git rm -cached aber ohne Erfolg. Stashing und unstashing die Änderungen schien zu funktionieren, aber sie bekam wieder in die Warteschlange nach einer Zeit (ich bin ein bity hazy auf den genauen Zeitrahmen). Ich habe diese Einträge schließlich endgültig entfernt, indem ich

git reset

Ich nehme an, dass dies nur dann eine gute Idee ist, wenn Sie keine Änderungen im Staged/Cache haben, die Sie tatsächlich übertragen wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X