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?
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 )
- 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/
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.
Dies ist ein zweistufiger Prozess:
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
Füge sie zu .gitignore
hinzu
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.
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
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
git add .
git commit -m 'removed all and added with git ignore'
git Push Origin master
Ich hoffe, das hilft Menschen, die ihren .gitignore
ändern oder alles zusammen vergessen müssen.
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>
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.
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?
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.
git update-index --skip-worktree MySetupClass.Java
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.
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
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
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
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:
Invariante bestellen!
Das .gitignore wird nach der Änderung neu geladen!
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
Ein fast git befehlsloser Ansatz wurde in dieser Antwort gegeben:
Zu ignorieren bestimmte Dateien für jedes lokale Repo:
~/.gitignore_global
, z. von touch ~/.gitignore_global
in Ihrem Terminal. git config --global core.excludesfile ~/.gitignore_global
aus.~/.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:
.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
.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/