Wie stoppe ich das Tracking und ignoriere Änderungen an einer Datei in Git?
Lesezeit: 10 Minuten
Josua Ball
Ich habe ein Projekt geklont, das einige enthält .csproj Dateien. Ich brauche/mag mein Lokal nicht csproj Dateien, die von Git verfolgt werden (oder beim Erstellen eines Patches aufgerufen werden), aber sie werden eindeutig im Projekt benötigt.
Ich habe hinzugefügt *.csproj zu meinem LOKAL .gitignoreaber die Dateien befinden sich bereits im Repo.
Wenn ich git status eingebe, werden meine Änderungen an angezeigt csproj die ich nicht verfolgen oder für Patches einreichen möchte.
Wie entferne ich das „Tracking“ dieser Dateien aus meinem persönlichen Repo (aber behalte sie in der Quelle, damit ich sie verwenden kann), damit ich die Änderungen nicht sehe, wenn ich einen Status mache (oder einen Patch erstelle)?
Gibt es einen korrekten/kanonischen Weg, um mit dieser Situation umzugehen?
Eine sehr nützliche Frage, aber ich bin neugierig, warum Sie Änderungen an der nicht nachverfolgen möchten .csproj Datei, die ein sehr wichtiger Teil jedes Projekts ist. Änderungen an der .csproj.user Datei oder irgendeine .Publish.XML Ich kann absolut verstehen, dass Dateien nicht verfolgt werden, aber ich bin gespannt, warum Sie die Dateien nicht verfolgen möchten .csproj…
– Owen Blacker
3. Mai 2012 um 10:26 Uhr
Vielleicht verwenden sie eine andere IDE?
– Jarrett
2. April 2013 um 1:17 Uhr
Ironischerweise kam ich zu diesem Thread, weil ich .suo-Dateien aus einem Repo entfernen, aber lokal aufbewahren möchte. Für die Nachwelt erfordert die .Net-Entwicklung, dass Sie .csproj-Dateien im Repo aufbewahren, und diese Änderungen sollten immer nachverfolgt werden, es sei denn, Sie möchten den Zorn anderer Entwickler auf Ihr Projekt spüren. Wenn Sie sich jemals unsicher sind, werfen Sie einen Blick auf das gitignore files Repo auf GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore
– Langda
22. September 2013 um 20:39 Uhr
@Cupcake, die Frage, auf die du verlinkt hast, wurde 15 Tage nach dieser geschrieben? Vielleicht fällt Ihnen noch eine andere ein?
– stephenmurdoch
16. Juni 2014 um 9:36 Uhr
@marflar kanonische Fragen müssen nicht unbedingt die sein älteste diejenigen, nur die Beste Einsen. Die, die ich verlinkt habe, hat 20 Antworten, während diese nur 5 hat.
– Benutzer456814
16. Juni 2014 um 16:11 Uhr
Antonius
Einfach anrufen git rm --cached für jede der Dateien, die Sie aus der Revisionskontrolle entfernen möchten, sollte in Ordnung sein. Solange Ihre lokalen Ignoriermuster korrekt sind, werden diese Dateien nicht in der Ausgabe von git status enthalten sein.
Beachten Sie, dass diese Lösung die Dateien aus dem Repository entfernt, sodass alle Entwickler ihre eigenen lokalen (nicht revisionskontrollierten) Kopien der Datei pflegen müssten
Um zu verhindern, dass git Änderungen in diesen Dateien erkennt, sollten Sie auch diesen Befehl verwenden:
git update-index --assume-unchanged [path]
Was Sie wahrscheinlich tun möchten: (von unten @Ryan Taylor Antwort)
Damit teilen Sie git mit, dass Sie Ihre eigene unabhängige Version der Datei oder des Ordners haben möchten. Beispielsweise möchten Sie Produktions-/Staging-Konfigurationsdateien nicht überschreiben (oder löschen).
“git rm –cached ” würde aus der Versionskontrolle entfernen, während es im Arbeits-Repository bleibt. Ob es das ist, was Sie wollen …
– Jakub Narębski
2. Juni 2009 um 0:03 Uhr
Aber wenn andere das Repository ziehen, wird ihre eigene *.csproj-Datei entfernt? Denn wenn wir wollen, dass die Datei nicht verfolgt, aber nicht gelöscht wird.
– FMaz008
1. Juni 2011 um 13:07 Uhr
Wenn Sie versuchen, ALLE Dateien in einem Verzeichnis zu entfernen, kombinieren Sie es mit git ls-files: git ls-files | xargs git rm --cached — das alles aus dem Git-Index in einem bestimmten Verzeichnis entfernt, ohne die eigentlichen Dateien zu löschen.
– Marco
10. November 2011 um 19:51 Uhr
git rm --cached -r <dir> arbeitet rekursiv mit einem Ordner und allen darin enthaltenen Dateien.
– Christa K
15. Februar 2013 um 1:29 Uhr
Dadurch wird die Verfolgung der Datei beendet, sie wird lokal aufbewahrt, aber dafür gesorgt, dass sie gespeichert wird gelöscht für alle die ziehen
– Eduard Newell
14. Februar 2014 um 0:58 Uhr
Ryan Taylor
Es gibt 3 Optionen; Sie wollen wahrscheinlich Nr. 3
Dadurch bleibt die lokale Datei für Sie erhalten, sie wird jedoch für alle anderen gelöscht, wenn sie ziehen.
git rm --cached <file-name> oder git rm -r --cached <folder-name>
Dies dient der Optimierung, wie ein Ordner mit einer großen Anzahl von Dateien, z. B. SDKs, die sich wahrscheinlich nie ändern werden. Es weist Git an, diesen riesigen Ordner nicht mehr jedes Mal auf lokale Änderungen zu überprüfen, da es keine geben wird. Die assume-unchanged Der Index wird zurückgesetzt und die Datei(en) überschrieben, wenn Upstream-Änderungen an der Datei/dem Ordner vorgenommen wurden (beim Pullen).
git update-index --assume-unchanged <path-name>
Dies soll Git mitteilen, dass Sie Ihre möchten eigene unabhängige Version der Datei oder des Ordners. Beispielsweise möchten Sie Produktions-/Staging-Konfigurationsdateien nicht überschreiben (oder löschen).
git update-index --skip-worktree <path-name>
Es ist wichtig, das zu wissen git update-indexwird sich nicht ausbreiten mit Git, sodass jeder Benutzer es unabhängig ausführen muss.
Diese Antwort ist die vollständigste – sie bietet verschiedene Lösungen mit den jeweiligen Auswirkungen. Der spezielle Fall, mit dem ich arbeite, hat ein Passwort, das in eine Konfigurationsdatei eingebettet ist. Ich möchte eine Vorlagendatei verbreiten und dann das Passwort zu meiner Kopie hinzufügen. Die Kopie mit dem Passwort sollte ignoriert und nicht überschrieben werden.
– bmacnaughton
20. November 2016 um 16:23 Uhr
Wie kann ich in meinem Lokal überprüfen, welche Dateien für ‘assume-unchanged’ oder ‘skip-worktree’ gelten?
– Supawat Pusavanno
19. September 2017 um 1:44 Uhr
@SupawatPusavanno, um zu sehen, welche Dateien Sie zuvor für „Unverändert annehmen“ oder „Arbeitsbaum überspringen“ ausgewählt haben, sehen Sie sich diese Antwort an stackoverflow.com/questions/42363881/… – es verwendet grep und git ls-files
– Ryan Taylor
19. September 2017 um 17:15 Uhr
Sehr gute Antwort. Aber git löst einen Fehler aus, wenn ich versuche, zu einem anderen Zweig zu wechseln: Fehler: “Ihre lokalen Änderungen an den folgenden Dateien würden durch das Auschecken überschrieben werden …..” und die Lösung besteht darin, die Änderungen vor dem Wechseln zu verstauen und zu entstashen, wenn Sie kommen zurück in die Filiale.
– PhantomReferenz
13. Dezember 2017 um 5:28 Uhr
@RyanTaylor ist es möglich, Ihre eigene lokale Version der Datei beizubehalten, ohne Ihre eigenen Änderungen zu übertragen, während Sie dennoch Änderungen abrufen, die an das Repo übertragen werden?
– Marc Sloth Eastman
18. Mai 2021 um 21:17 Uhr
araqnid
Wenn Sie tun git update-index --assume-unchanged file.csproj, git überprüft file.csproj nicht automatisch auf Änderungen: Dadurch werden sie nicht mehr im Git-Status angezeigt, wenn Sie sie ändern. Sie können also alle Ihre .csproj-Dateien auf diese Weise markieren – obwohl Sie alle neuen, die Ihnen das Upstream-Repo sendet, manuell markieren müssen. (Wenn Sie sie in Ihrem haben .gitignore oder .git/info/excludedann werden die von Ihnen erstellten ignoriert)
Ich bin mir nicht ganz sicher, was .csproj-Dateien sind … wenn sie etwas in der Art von IDE-Konfigurationen sind (ähnlich den .eclipse- und .classpath-Dateien von Eclipse), dann würde ich vorschlagen, dass sie einfach niemals quellgesteuert sein sollten alle. Auf der anderen Seite, wenn sie Teil des Build-Systems sind (wie Makefiles), dann sollten sie das natürlich tun — und eine Möglichkeit, optionale lokale Änderungen (z. B. von einer local.csproj a la config.mk) aufzunehmen, wäre nützlich : Unterteilen Sie den Aufbau in globale Teile und lokale Überschreibungen.
csproj ist eine C#-Projektdatei, die nachverfolgt, welche Dateien in Ihrem Projekt und einigen anderen Konfigurationen enthalten sind. Sie MUSS quellcodegesteuert sein, damit das Projekt funktioniert
– Funke
4. Dezember 2013 um 15:20 Uhr
Dies ist die einzig richtige Antwort hier! Ich verwende @araqnids answer seit Jahren und es funktioniert genau wie gewünscht, um dieses Problem zu lösen.
– NHDaly
27. Mai 2014 um 4:31 Uhr
Gibt es eine Möglichkeit zu erkennen, dass dies für eine Datei durchgeführt wurde oder für welche Dateien dies in einem Repo durchgeführt wurde? Ich bin ein bisschen nervös, weil ich vergesse, dass ich das getan habe, und mich dann frage, warum zum Teufel diese Datei später nicht aktualisiert wird!
– GreenAsJade
27. November 2014 um 2:41 Uhr
@GreenAsJade: git ls-files -v zeigt Dateien, die als unverändert angenommen werden, mit einem Kleinbuchstaben an (z h statt üblich H für zwischengespeicherte Dateien).
– Amadan
27. November 2014 um 3:42 Uhr
Danke – diese kleine Perle verdient fast eine eigene Frage! … erledigt stackoverflow.com/questions/27162966/…
– GreenAsJade
27. November 2014 um 4:12 Uhr
rjha94
Dies ist ein zweistufiger Prozess:
Entfernen Sie die Nachverfolgung von Dateien/Ordnern – aber behalten Sie sie auf der Festplatte – mit
git rm --cached
Jetzt werden sie nicht mehr als “geändert” angezeigt, aber immer noch als angezeigt
untracked files in git status -u
Fügen Sie sie hinzu .gitignore
Die akzeptierte Antwort hat bei mir immer noch nicht funktioniert
Dieser Link ist sehr nützlich, insbesondere um alle Dateien in der .gitignore rekursiv zu entfernen
– rmcsharry
13. April 2016 um 10:44 Uhr
Ich bin 3 Mal hierher zurückgekehrt, hoffentlich kann ich mich vor dem nächsten Mal daran erinnern!
– Harry Bosch
20. April 2016 um 1:09 Uhr
Der Kommentar von @Edward Newell wie in der obigen Antwort gilt auch hier: “Dies wird die Datei aus dem Tracking entfernen, sie lokal aufbewahren, aber dafür sorgen, dass es für jeden gelöscht wird, der zieht“.
– ToJo
5. Mai 2020 um 20:17 Uhr
Gangnus
Sie haben Ihre .gitignore-Datei vergessen?
Wenn Sie das gesamte Projekt lokal haben, aber vergessen haben, Git Ignore hinzuzufügen, und jetzt einige unnötige Dateien verfolgen, verwenden Sie diesen Befehl, um alles zu entfernen
git rm --cached -r .
Stellen Sie sicher, dass Sie sich an der Wurzel des Projekts befinden.
Dann können Sie das Übliche tun
Addieren
git add .
Begehen
git commit -m 'removed all and added with git ignore'
Drücken
git push origin master
Fazit
Hoffe, das hilft Leuten, die Änderungen an ihrem vornehmen müssen .gitignore oder alles zusammen vergessen.
Es entfernt den gesamten Cache
Betrachtet Ihre .gitignore
Fügt die Dateien hinzu, die Sie verfolgen möchten
Pusht zu Ihrem Repo
Dieser Link ist sehr nützlich, insbesondere um alle Dateien in der .gitignore rekursiv zu entfernen
– rmcsharry
13. April 2016 um 10:44 Uhr
Ich bin 3 Mal hierher zurückgekehrt, hoffentlich kann ich mich vor dem nächsten Mal daran erinnern!
– Harry Bosch
20. April 2016 um 1:09 Uhr
Der Kommentar von @Edward Newell wie in der obigen Antwort gilt auch hier: “Dies wird die Datei aus dem Tracking entfernen, sie lokal aufbewahren, aber dafür sorgen, dass es für jeden gelöscht wird, der zieht“.
– ToJo
5. Mai 2020 um 20:17 Uhr
Wie in anderen Antworten erwähnt, ist die ausgewählte Antwort falsch.
Die Antwort auf eine andere Frage deutet darauf hin, dass möglicherweise Skip-Worktree erforderlich wäre.
git update-index --skip-worktree <file>
Diese Antwort verlinkt auf einen Artikel (http://fallengamer.livejournal.com/93321.html) und zitiert den Artikel mit einer schönen Zusammenfassung des Unterschieds zwischen –assume-unchanged und –skip-worktree wie folgt:
–annehmen-unverändert geht davon aus, dass ein Entwickler eine Datei nicht ändern sollte. Dieses Flag soll die Leistung für sich nicht ändernde Ordner wie SDKs verbessern.
–skip-worktree ist nützlich, wenn Sie git anweisen, eine bestimmte Datei niemals anzufassen, weil Entwickler sie ändern sollten. Wenn zum Beispiel das Haupt-Repository Upstream einige produktionsbereite Konfigurationsdateien hostet und Sie nicht versehentlich Änderungen an diesen Dateien festschreiben möchten, ist –skip-worktree genau das, was Sie wollen.
Alle Anerkennung geht an Borealid für ihre Recherche und Antwort. Fügen Sie diese Informationen hier rein aus Gründen der Bequemlichkeit für andere hinzu.
Nein nicht wirklich: --skip-worktree wird benutzt um Behalten Sie die Datei im Repository, aber hören Sie auf, ihre Änderungen zu verfolgen. Wie deine Antwort sagt: –skip-worktree ist nützlich, wenn Sie git anweisen, eine bestimmte Datei niemals zu berühren, weil Entwickler sollte ändern Sie es
– Erdal G.
9. November 2015 um 12:29 Uhr
@ErdalG. Exakt. Gemäß der Frage möchten sie alle Änderungen in der Datei ignorieren, aber die Datei im Repo behalten
– der_neue_mr
31. August 2016 um 11:05 Uhr
Stimme @the_new_mr zu, --assume-unchanged und --skip-worktree haben eine ähnliche Wirkung, aber ihre Zwecke sind völlig unterschiedlich. Ersteres dient dazu, die Git-Leistung zu beschleunigen, indem Git getäuscht wird bestimmte Dateien nicht zu überprüfenwährend letzteres für ist Ignorieren zukünftiger Änderungen an bestimmten Dateiendie für die Laufzeit geeignet sind, aber wichtige Dateien.
– Viktor Wong
15. September 2016 um 4:00 Uhr
9871000cookie-checkWie stoppe ich das Tracking und ignoriere Änderungen an einer Datei in Git?yes
Eine sehr nützliche Frage, aber ich bin neugierig, warum Sie Änderungen an der nicht nachverfolgen möchten
.csproj
Datei, die ein sehr wichtiger Teil jedes Projekts ist. Änderungen an der.csproj.user
Datei oder irgendeine.Publish.XML
Ich kann absolut verstehen, dass Dateien nicht verfolgt werden, aber ich bin gespannt, warum Sie die Dateien nicht verfolgen möchten.csproj
…– Owen Blacker
3. Mai 2012 um 10:26 Uhr
Vielleicht verwenden sie eine andere IDE?
– Jarrett
2. April 2013 um 1:17 Uhr
Ironischerweise kam ich zu diesem Thread, weil ich .suo-Dateien aus einem Repo entfernen, aber lokal aufbewahren möchte. Für die Nachwelt erfordert die .Net-Entwicklung, dass Sie .csproj-Dateien im Repo aufbewahren, und diese Änderungen sollten immer nachverfolgt werden, es sei denn, Sie möchten den Zorn anderer Entwickler auf Ihr Projekt spüren. Wenn Sie sich jemals unsicher sind, werfen Sie einen Blick auf das gitignore files Repo auf GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore
– Langda
22. September 2013 um 20:39 Uhr
@Cupcake, die Frage, auf die du verlinkt hast, wurde 15 Tage nach dieser geschrieben? Vielleicht fällt Ihnen noch eine andere ein?
– stephenmurdoch
16. Juni 2014 um 9:36 Uhr
@marflar kanonische Fragen müssen nicht unbedingt die sein älteste diejenigen, nur die Beste Einsen. Die, die ich verlinkt habe, hat 20 Antworten, während diese nur 5 hat.
– Benutzer456814
16. Juni 2014 um 16:11 Uhr