it-swarm.com.de

Wie kann ich das Tracking stoppen und Änderungen an einer Datei in Git ignorieren?

Ich habe ein Projekt geklont, das einige .csproj-Dateien enthält. Ich brauche/meine lokalen csproj-Dateien nicht, die von Git verfolgt werden (oder beim Erstellen eines Patches aufgerufen werden), aber sie werden eindeutig im Projekt benötigt.

Ich habe *.csproj zu meinem LOCAL .gitignore hinzugefügt, aber die Dateien befinden sich bereits im Repo.

Wenn ich git status eingebe, werden meine Änderungen an csproj angezeigt, an denen ich kein Interesse habe, Patches zu verfolgen oder einzureichen.

Wie entferne ich das "Tracking" dieser Dateien aus meinem persönlichen Repo (aber belasse sie in der Quelle, damit ich sie verwenden kann), damit ich die Änderungen nicht sehe, wenn ich einen Status mache (oder ein Patch erstellt)?

Gibt es einen richtigen/kanonischen Weg, um mit dieser Situation umzugehen?

1508
Joshua Ball

Das Aufrufen von 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 des Git-Status angezeigt.

Beachten Sie, dass diese Lösung die Dateien aus dem Repository entfernt, sodass alle Entwickler ihre eigenen lokalen (nicht revisionskontrollierten) Kopien der Datei verwalten müssen

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 antworten )

  1. Damit teilen Sie git mit, dass Sie eine eigene, unabhängige Version der Datei oder des Ordners benötigen. Zum Beispiel möchten Sie nicht. Überschreiben (oder löschen). Produktions-/Staging-Konfigurationsdateien.

git update-index --skip-worktree <path-name>

Die vollständige Antwort finden Sie hier in dieser URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/

1891
anthony

Wenn Sie git update-index --assume-unchanged file.csproj tun, überprüft git file.csproj nicht automatisch auf Änderungen. Dadurch werden sie nicht mehr im git-Status angezeigt, wenn Sie sie ändern. So können Sie alle Ihre .csproj-Dateien auf diese Weise markieren. Sie müssen jedoch alle neuen Dateien manuell markieren, die Ihnen das Upstream-Repo sendet. (Wenn Sie sie in Ihrem .gitignore oder .git/info/exclude haben, werden diejenigen, die Sie erstellen, ignoriert.)

Ich bin mir nicht ganz sicher, was .csproj-Dateien sind ... Wenn sie etwas in der Art von IDE -Konfigurationen sind (ähnlich wie die Eclipse-Dateien .Eclipse und .classpath), würde ich vorschlagen, dass sie dies niemals tun sollten quellengesteuert überhaupt. Wenn sie jedoch Teil des Build-Systems sind (wie Makefiles), sollten sie eindeutig --- und eine Möglichkeit, optionale lokale Änderungen (z. B. von einem local.csproj a la config.mk) zu übernehmen, wäre nützlich : Teilen Sie den Aufbau in globale Teile und lokale Überschreibungen auf.

232
araqnid

Dies ist ein zweistufiger Prozess:

  1. Entfernen Sie das Tracking der Datei/des Ordners - aber behalten Sie sie auf der Festplatte 

    git rm --cached 
    

    Jetzt werden sie nicht als "geändert" angezeigt, sondern immer noch als angezeigt 

        untracked files in  git status -u  
    
  2. Füge sie zu .gitignore hinzu

140
rjha94

Es gibt 3 Optionen, die Sie wahrscheinlich # 3 wollen

1. Dies behält die lokale Datei für Sie, löscht sie jedoch für alle anderen, wenn sie ziehen.

git rm --cached <file-name> oder git rm -r --cached <folder-name>

2. Dies dient zur Optimierung wie ein Ordner mit einer großen Anzahl von Dateien, z. SDKs, die sich wahrscheinlich nicht ändern werden. Git wird aufgefordert, diesen riesigen Ordner nicht mehr lokal auf Änderungen zu überprüfen, da er keine hat. Der assume-unchanged-Index wird zurückgesetzt und die Datei (en) überschrieben, wenn sich Upstream-Änderungen an der Datei/dem Ordner ergeben (beim Abrufen).

git update-index --assume-unchanged <path-name>

3. Hiermit teilen Sie git mit, dass Sie eine eigene, unabhängige Version der Datei oder des Ordners benötigen. Beispielsweise möchten Sie keine Konfigurations-/Bereitstellungskonfigurationsdateien überschreiben (oder löschen).

git update-index --skip-worktree <path-name>

Es ist wichtig zu wissen, dass git update-index sich nicht mit git ausbreitet und dass jeder Benutzer es unabhängig ausführen muss.

137
Ryan Taylor

Die akzeptierte Antwort hat für mich immer noch nicht funktioniert

Ich benutzte 

git rm -r --cached.

git add.

git commit -m "Fixieren von .gitignore"

Die Antwort von hier gefunden 

82

Vergessen Sie Ihren .gitignore?

Wenn Sie das gesamte Projekt lokal gespeichert haben und vergessen haben, es hinzuzufügen, ignorieren Sie git. Jetzt werden einige nicht benötigte Dateien verfolgt. Verwenden Sie diesen Befehl, um alles zu entfernen

git rm --cached -r .

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

Dann kannst du das übliche tun 

Hinzufügen

git add .

Verpflichten

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

Drücken

git Push Origin master

Fazit

Ich hoffe, das hilft Menschen, die ihren .gitignore ändern oder alles zusammen vergessen müssen. 

  • Es entfernt den gesamten Cache
  • Sieh dir deinen .gitignore an
  • Fügt die Dateien hinzu, die Sie verfolgen möchten
  • Schiebt zu Ihrem Repo
41
Joe Lloyd

Wie in anderen Antworten darauf hingewiesen, ist die ausgewählte Antwort falsch.

Die Antwort zu einer anderen Frage deutet an, dass es möglicherweise ein Überspring-Worktree ist.

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

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

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

oder

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

usw.

21
Peter

Viele Leute raten Ihnen, git update-index --assume-unchanged zu verwenden. In der Tat kann dies eine gute Lösung sein, aber nur auf kurze Sicht.

Was Sie wahrscheinlich tun möchten, ist Folgendes: git update-index --skip-worktree.

(Die dritte Option, die Sie wahrscheinlich nicht möchten, ist: git rm --cached. Ihre lokale Datei wird beibehalten, aber als aus dem Remote-Repository entfernt markiert.)

Unterschied zwischen den ersten beiden Optionen?

  • Mit assume-unchanged können Sie vorübergehend Änderungen an einer Datei ausblenden. Wenn Sie die an einer Datei vorgenommenen Änderungen ausblenden möchten, die Datei ändern und einen anderen Zweig auschecken möchten, müssen Sie no-assume-unchanged verwenden.
  • skip-worktree folgt Ihnen mit Ihren Änderungen, egal in welcher Branche Sie sich gerade befinden.

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 ausführen. Wenn Sie jedoch in einen anderen Zweig auschecken, müssen Sie zuvor das Flag zurücksetzen und Änderungen vornehmen oder speichern. Wenn Sie bei aktivierter Option ziehen, müssen Sie Konflikte lösen, und git wird nicht automatisch zusammengeführt. Tatsächlich werden nur Änderungen verborgen (git status zeigt die markierten Dateien nicht an).

Ich benutze es gerne, wenn ich nur für eine Weile die Nachverfolgung von Änderungen stoppen möchte + eine Reihe von Dateien (git commit -a) übergeben, die sich auf die same - Änderung beziehen.

Anwendungsfall von skip-worktree

Sie haben eine Setup-Klasse mit Parametern (z. B. einschließlich Passwörtern), die Ihre Freunde entsprechend ihrem Setup ä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 an 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 zu einer anderen Funktionalität.

Die Änderungen, die Sie vornehmen, werden Ihnen unabhängig von der Branche folgen. Warnung: Wenn Ihre Freunde auch diese Klasse ändern möchten, müssen sie dasselbe Setup haben, andernfalls würden ihre Änderungen in das Remote-Repository verschoben. Beim Ziehen sollte die Remote-Version der Datei Ihre überschreiben.

PS: Tun Sie die eine oder andere, aber nicht beides, da Sie unerwünschte Nebenwirkungen haben. Wenn Sie ein anderes Flag verwenden möchten, sollten Sie das letztere deaktivieren.

7
belka

Gehen Sie folgendermaßen vor, um Git anzuweisen, Änderungen an Ihrer lokalen Datei/Ihrem Ordner nicht zu verfolgen (dh, der Git-Status erkennt keine Änderungen daran):

git update-index --skip-worktree path/to/file

Und um Git anzuweisen, die Änderungen an Ihrer lokalen Version erneut zu verfolgen (damit Sie die Änderungen festschreiben können), führen Sie Folgendes aus:

git update-index --no-skip-worktree path/to/file
5
Ruto Collins

Um zu verhindern, dass eine Datei von git überwacht wird

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

Und um es wieder zurückzugewinnen 

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

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

4
shijin

Ich gehe davon aus, dass Sie fragen, wie Sie ALL die Dateien in einem bestimmten Ordner oder im bin-Ordner entfernen, anstatt jede Datei einzeln auszuwählen. 

Sie können diesen Befehl verwenden:

git rm -r -f /<floder-name>\*

Stellen Sie sicher, dass Sie sich im übergeordneten Verzeichnis des Verzeichnisses befinden.
Dieser Befehl löscht rekursiv alle Dateien, die sich in den Ordnern bin/oder build/befinden. Mit dem Wort löschen meine ich, dass git vorgeben wird, dass diese Dateien "gelöscht" werden und diese Dateien nicht verfolgt werden. Das git kennzeichnet diese Dateien wirklich im Löschmodus.

Stellen Sie sicher, dass Ihr .gitignore für kommende Commits bereit ist.
Dokumentation: git rm

0
Vraj Pandya

Das Problem kann durch die Reihenfolge der Operation verursacht werden .. Wenn Sie zuerst den .gitignore geändert haben, dann git rm --cached xxx, müssen Sie möglicherweise dieses Problem weiterhin feststellen.

Richtige Lösung:

  1. git rm --cached xxx
  2. den .gitignore geändert

Invariante bestellen!

Das .gitignore wird nach der Änderung neu geladen!

0
thearyong

Ich gehe davon aus, dass Sie versuchen, eine einzelne Datei von git tacking . Zu entfernen. Dafür würde ich den folgenden Befehl empfehlen.

git Update-Index --assume-unverändert

Ex-git Update-Index --assume-unverändert .gitignore .idea/compiler.xml

0
Pankaj Sonani

Ein fast git befehlsloser Ansatz wurde in dieser Antwort gegeben:

Zu ignorieren bestimmte Dateien für jedes lokale Repo:

  1. Erstellen Sie eine Datei ~/.gitignore_global, z. von touch ~/.gitignore_global in Ihrem Terminal. 
  2. Führen Sie einmal git config --global core.excludesfile ~/.gitignore_global aus.
  3. Schreiben Sie die Datei-/Verzeichnispfade, die Sie ignorieren möchten, in ~/.gitignore_global. z.B. modules/*.H, von dem angenommen wird, dass er sich in Ihrem Arbeitsverzeichnis befindet, d. h. $WORK_DIR/modules/*.H.

Zu ignorieren bestimmte Dateien für ein einzelnes lokales Repo:

  1. Führen Sie den obigen dritten Schritt für die Datei .git/info/exclude innerhalb des Repos aus, dh schreiben Sie die Datei-/Verzeichnispfade, die Sie ignorieren möchten, in .git/info/exclude. z.B. modules/*.C, von dem angenommen wird, dass er sich in Ihrem Arbeitsverzeichnis befindet, d. h. $WORK_DIR/modules/*.C.
0
KutalmisB

Um Änderungen an allen Dateien (eines bestimmten Typs) in einem Verzeichnis zu ignorieren, musste ich einige dieser Ansätze kombinieren, andernfalls wurden die Dateien erstellt, wenn sie zuvor nicht vorhanden waren.

Im Folgenden ist "excludedir" der Name des Verzeichnisses, in dem ich keine Änderungen ansehen möchte.

Entfernen Sie zunächst alle vorhandenen neuen Dateien aus Ihrem Änderungsverfolgungscache (ohne sie aus Ihrem Dateisystem zu entfernen).

git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

Sie können dasselbe mit modified: tun. renamed: ist etwas komplizierter, da Sie für das neue Dateiname das Post ->-Bit betrachten und das vor ->-Bit wie unter deleted: beschrieben ausführen müssen.

deleted:-Dateien sind etwas komplizierter, da Sie den Index für eine Datei, die auf dem lokalen System nicht vorhanden ist, nicht aktualisieren können

echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm

Mit dem letzten Befehl in der obigen Liste werden die Dateien wieder aus Ihrem Dateisystem entfernt. Sie können dies also einfach weglassen.

Blockieren Sie dann die Änderungsnachverfolgung in diesem Verzeichnis

git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/
0
mpag