2068 Stimmen

Wie stoppt man die Verfolgung und ignoriert Änderungen an einer Datei in Git?

Ich habe ein Projekt geklont, das einige .csproj Dateien. Ich brauche/mag meine lokalen csproj Dateien, die von Git nachverfolgt werden (oder beim Erstellen eines Patches angezeigt werden), aber sie werden eindeutig im Projekt benötigt.

Ich habe hinzugefügt *.csproj zu meinem LOKALEN .gitignore aber die Dateien sind bereits in der Repo.

Wenn ich git status eingebe, zeigt es meine Änderungen an csproj die ich nicht im Auge behalten oder für Patches einreichen möchte.

Wie entferne ich das "Tracking" dieser Dateien aus meinem persönlichen Repo (behalte sie aber im Quellcode, damit ich sie verwenden kann), so dass ich die Änderungen nicht sehe, wenn ich einen Status mache (oder einen Patch erstelle)?

Gibt es einen korrekten/kanonischen Weg, diese Situation zu handhaben?

22 Stimmen

Eine sehr nützliche Frage, aber ich bin neugierig, warum Sie nicht die Änderungen an der .csproj Datei, die ein wichtiger Bestandteil eines jeden Projekts ist. Änderungen an der .csproj.user Datei oder eine .Publish.XML Ich kann durchaus verstehen, dass Sie keine Dateien verfolgen wollen, aber ich frage mich, warum Sie nicht auch die .csproj

9 Stimmen

Vielleicht verwenden sie eine andere IDE?

4 Stimmen

Ironischerweise bin ich auf diesen Thread gestoßen, weil ich .suo-Dateien aus einem Repo entfernen, aber lokal behalten möchte. Für die Nachwelt: Bei der .Net-Entwicklung ist es erforderlich, .csproj-Dateien im Repo zu behalten, und diese Änderungen sollten immer nachverfolgt werden, es sei denn, Sie möchten den Zorn anderer Entwickler an Ihrem Projekt spüren. Wenn Sie sich unsicher sind, werfen Sie einen Blick auf das Gitignore Files Repo auf GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore

56voto

Joe Lloyd Punkte 10242

Haben Sie Ihre .gitignore vergessen?

Wenn Sie das gesamte Projekt lokal haben, aber vergessen haben, git ignore hinzuzufügen und nun einige unnötige Dateien verfolgen, verwenden Sie diesen Befehl, um alles zu entfernen

git rm --cached -r .

stellen Sie sicher, dass Sie an der Wurzel des Projekts stehen.

Dann können Sie das Übliche tun

hinzufügen

git add .

Commit

git commit -m 'removed all and added with git ignore'

Schieben Sie

git push origin master

Schlussfolgerung

Ich hoffe, dies hilft denjenigen, die Änderungen an ihren Geräten vornehmen müssen. .gitignore oder sie ganz vergessen.

  • Es entfernt den gesamten Cache
  • Sieht sich Ihre .gitignore an
  • Fügt die Dateien hinzu, die Sie verfolgen möchten
  • Pusht in Ihr Repo

5 Stimmen

Wenn Sie über das Entfernen oder Hinzufügen sprechen, vergessen Sie zu sagen, wann und wo. Aus der Titelliste entfernen? Aus dem Projektarchiv? Aus dem lokalen Projektraum? Entfernen beim Pull? Beim Commit? Beim Push? Leider haben alle Autoren hier das gleiche Problem.

4 Stimmen

@Gangnus Ich glaube nicht, dass irgendjemand den Punkt "geklärt" hat, auf den Sie hinauswollen, denn es ist völlig klar, dass die Datei nicht wirklich von der Festplatte oder aus dem Repository entfernt wird. Diese Antwort gibt die chronologische Reihenfolge der Befehle an. Sie ist nicht mysteriös oder schlecht erklärt, wie Ihr Kommentar vermuten lässt.

0 Stimmen

@Edward Newell 's Kommentar wie in der obige Antwort gilt auch hier: "Damit wird die Datei aus der Verfolgung entfernt und lokal gespeichert, sondern bewirken, dass sie für jeden, der sie abruft, gelöscht wird. ".

43voto

shijin Punkte 2726

So verhindern Sie die Überwachung einer Datei oder eines Pfads durch git

git update-index --assume-unchanged [file-path]

Und um sie wieder rückgängig zu machen, verwenden Sie

git update-index --no-assume-unchanged [file-path]

Ein Repo zum Nachschlagen für ähnliche Anwendungsfälle https://github.com/awslabs/git-secrets

41voto

the_new_mr Punkte 3150

Wie bereits in anderen Antworten erwähnt, ist die gewählte Antwort falsch.

El Antwort auf eine andere Frage deutet darauf hin, dass möglicherweise ein Skip-Worktree erforderlich wäre.

git update-index --skip-worktree <file>

Das Antwort verweist 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:

--aufgenommen-verändert geht davon aus, dass ein Entwickler eine Datei nicht ändern sollte. Dieses Flag ist für die Verbesserung der Leistung bei sich nicht ändernden Ordnern gedacht wie SDKs.

--skip-worktree ist nützlich, wenn Sie git anweisen, eine bestimmte Datei niemals anzurühren, weil Entwickler sie ändern sollten. Zum Beispiel, wenn das Haupt-Repository im Upstream einige produktionsreife Konfigurationsdateien beherbergt und Sie nicht versehentlich Änderungen an diesen Dateien vornehmen wollen an diese Dateien zu übertragen, ist --skip-worktree genau das Richtige für Sie.

Alle Anerkennung an langweilig für ihre Recherchen und Antworten. Einschließlich dieser Informationen hier rein für die Bequemlichkeit der anderen.

2 Stimmen

Nein, nicht wirklich: --skip-worktree wird verwendet, um die Datei im Repository behalten, aber ihre Änderungen nicht mehr verfolgen . Wie Ihre Antwort sagt: --skip-worktree ist nützlich, wenn Sie git anweisen, eine bestimmte Datei nicht zu berühren, weil Entwickler sollte es ändern

6 Stimmen

@ErdalG. Genau. Laut der Frage wollen sie alle Änderungen in der Datei ignorieren, aber die Datei im Repo behalten

1 Stimmen

Stimme mit @the_new_mr überein, --assume-unchanged y --skip-worktree haben eine ähnliche Wirkung, dienen aber einem völlig anderen Zweck. Ersterer dient dazu, die Leistung von Git zu beschleunigen, indem er Git austrickst bestimmte Dateien nicht zu prüfen , während die letztere für Ignorieren zukünftiger Änderungen an bestimmten Dateien die für die Laufzeit geeignet sind, aber wesentliche Dateien.

27voto

Peter Punkte 4099

Um etwas Zeit zu sparen, können die Regeln, die Sie zu Ihrer .gitignore hinzufügen, zum Entfernen mehrerer Dateien/Ordner verwendet werden, z. B.

git rm --cached app/**/*.xml

oder

git rm --cached -r app/widgets/yourfolder/

usw.

0 Stimmen

Dies ist eine sehr gute Lösung, da man den Gitignore auf jeden Fall Schritt für Schritt beheben möchte

17voto

belka Punkte 1322

Viele Leute raten Ihnen, die git update-index --assume-unchanged . Dies kann in der Tat eine gute Lösung sein, aber nur kurzfristig.

Wahrscheinlich wollen Sie Folgendes tun: git update-index --skip-worktree .

(Die dritte Option, die Sie wahrscheinlich nicht wollen, ist: git rm --cached . Ihre lokale Datei bleibt erhalten, wird aber als aus dem entfernten Repository entfernt markiert).

Was ist der Unterschied zwischen den ersten beiden Optionen?

  • assume-unchanged soll es Ihnen ermöglichen, Änderungen an einer Datei vorübergehend auszublenden. Wenn Sie Änderungen an einer Datei verbergen wollen, die Datei ändern und dann einen anderen Zweig auschecken wollen, müssen Sie no-assume-unchanged dann wahrscheinlich Versteckänderungen vorgenommen.
  • skip-worktree folgt Ihnen, egal welchen Zweig Sie auschecken, mit Ihren Änderungen!

Anwendungsfall von assume-unchanged

Es wird davon ausgegangen, dass diese Datei nicht geändert werden sollte, und Sie erhalten eine sauberere Ausgabe, wenn Sie git status . Aber wenn Sie in einen anderen Zweig auschecken, müssen Sie die Markierung zurücksetzen und die Änderungen vorher committen oder zwischenlagern. Wenn Sie mit aktivierter Option pullen, müssen Sie Konflikte lösen und Git wird nicht automatisch zusammenführen. Es verbirgt eigentlich nur Änderungen ( git status zeigt Ihnen die markierten Dateien nicht an).

Ich verwende es gerne, wenn ich nur für eine Weile keine Änderungen mehr verfolgen und eine Reihe von Dateien übertragen möchte ( git commit -a ) im Zusammenhang mit dem dieselbe Änderung.

Anwendungsfall von skip-worktree

Sie haben eine Einrichtungsklasse mit Parametern (z. B. einschließlich Passwörtern), die Ihre Freunde entsprechend ihrer Einrichtung ändern müssen.

  • 1: Erstellen Sie eine erste Version dieser Klasse, füllen Sie Felder aus, die Sie ausfüllen können, und lassen Sie andere leer/null.
  • 2: Commit und Push auf den Remote-Server.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: Aktualisieren Sie Ihre Konfigurationsklasse mit Ihren eigenen Parametern.
  • 5: Gehen Sie zurück und arbeiten Sie an einer anderen Funktionalität.

Die Änderungen, die Sie vornehmen, werden Sie in jeder Branche begleiten. Achtung: Wenn Ihre Freunde diese Klasse ebenfalls ändern wollen, müssen sie die gleichen Einstellungen haben, da sonst ihre Änderungen in das entfernte Repository übertragen werden. Beim Ziehen sollte die entfernte Version der Datei die Ihre überschreiben.

PS: Machen Sie das eine oder das andere, aber nicht beides, da Sie sonst unerwünschte Nebenwirkungen haben. Wenn Sie eine andere Flagge ausprobieren wollen, sollten Sie zuerst die letztere deaktivieren.

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