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

13voto

Kaka Ruto Punkte 3540

Um Git anzuweisen, Änderungen an Ihrer lokalen Datei/Ordner nicht zu verfolgen (was bedeutet, dass Git-Status keine Änderungen daran erkennt), tun Sie Folgendes:

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

Und um Git anzuweisen, Änderungen an Ihrer lokalen Version erneut zu verfolgen (damit Sie die Änderungen übertragen können), tun Sie dies:

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

4voto

goofology Punkte 767

.gitignore auf die Gegenwart/Zukunft anwenden

Diese Methode wendet das Standardverhalten von .gitignore an, und keine manuelle Angabe der Dateien, die ignoriert werden sollen, erforderlich ist .

Kann nicht verwendet werden --exclude-from=.gitignore mehr :/ - Hier ist die aktualisierte Methode:

Allgemeine Hinweise: mit einem sauberen Repository beginnen - alles übertragen, nichts im Arbeitsverzeichnis oder im Index ausstehend, und eine Sicherungskopie erstellen !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Wenn Sie auch die neu ignorierten Dateien aus dem Commit-Verlauf des Zweigs löschen müssen oder wenn Sie nicht wollen, dass die neu ignorierten Dateien bei zukünftigen Pulls gelöscht werden siehe diese Antwort .

3voto

Seeni Punkte 1354

Einzeilige Antwort git update-index --assume-unchanged [path]

Verwenden Sie dies immer dann, wenn Sie eine Datei haben, die sowohl im zentralen Repository als auch im lokalen Repository vorhanden ist. Sie müssen Änderungen an dieser Datei vornehmen, die jedoch nicht in das zentrale Repository übertragen werden dürfen. Diese Datei sollte nicht in .gitignore . weil neue Änderungen in der Datei, wenn sie von Systemadministratoren, erfahrenen Entwicklern eingeführt werden, auf alle lokalen Repos verteilt werden müssen.

Bestes Beispiel: Konfigurationsdatei für DB-Verbindungen . In einem zentralen Repo haben Sie alle Benutzernamen, Passwörter, Host und Port mit den Werten eines Produktions-DB-Servers. Aber in der lokalen Entwicklung sollten Sie nur einen lokalen oder einen anderen Entwicklungs-DB-Server verwenden (den Ihr Team eingerichtet hat). In diesem Fall möchten Sie Änderungen in der Konfigurationsdatei vornehmen, die jedoch nicht in das zentrale Repository übertragen werden sollten.

Am besten

2voto

git rm --fileName

git ls-files um sicherzustellen, dass die Datei entfernt oder nicht mehr verfolgt wird

git commit -m "UntrackChanges"

git push

0voto

mpag Punkte 489

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

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

Entfernen Sie zunächst alle vorhandenen neuen Dateien aus Ihrem Cache für die Änderungsverfolgung (ohne sie aus dem Dateisystem zu entfernen).

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

Das Gleiche können Sie tun mit modified: . renamed: ist etwas komplizierter, denn Sie müssen sich den Beitrag -> Bit für den neuen Dateinamen, und führen Sie die Pre -> Bit wie beschrieben für deleted: unten.

deleted: Dateien erweisen sich als etwas komplizierter, da man den Index für eine Datei, die auf dem lokalen System nicht existiert, nicht aktualisieren kann

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

Der letzte Befehl in der obigen Liste entfernt die Dateien wieder aus Ihrem Dateisystem, Sie können ihn also auch weglassen.

Dann blockieren Sie die Änderungsverfolgung von diesem Verzeichnis aus

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

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