Ich habe ein Projekt geklont, das einige .csproj
Dateien enthält. Ich brauche / mag nicht, dass meine lokalen csproj
Dateien 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 hinzugefügt .gitignore
, aber die Dateien befinden sich bereits im Repo.
Wenn ich den Git-Status eingebe, werden meine Änderungen angezeigt, an csproj
denen ich nicht interessiert bin, Patches zu verfolgen oder einzureichen.
Wie entferne ich das "Tracking" dieser Dateien aus meinem persönlichen Repo (behalte sie jedoch 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?
.csproj
Datei nicht nachverfolgen möchten , was ein wichtiger Bestandteil jedes Projekts ist. Änderungen an der.csproj.user
Datei oder an.Publish.XML
Dateien, die ich völlig verstehen kann, nicht verfolgen, aber ich bin gespannt, warum Sie die nicht verfolgen möchten.csproj
...Antworten:
Es
git rm --cached
sollte in Ordnung sein, nur jede der Dateien aufzurufen, die Sie aus der Revisionskontrolle entfernen möchten. Solange Ihre lokalen Ignoriermuster korrekt sind, werden diese Dateien nicht in der Ausgabe des 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 verwalten müssen
Um zu verhindern, dass git Änderungen in diesen Dateien erkennt, sollten Sie auch diesen Befehl verwenden:
Was Sie wahrscheinlich tun möchten: (von unten @ Ryan Taylor Antwort )
Die vollständige Antwort finden Sie hier in dieser URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
quelle
git ls-files | xargs git rm --cached
- Dadurch wird alles aus dem git-Index in einem bestimmten Verzeichnis entfernt, ohne die tatsächlichen Dateien zu löschen.git rm --cached -r <dir>
arbeitet rekursiv an einem Ordner und allen darin enthaltenen Dateien.Wenn Sie dies tun
git update-index --assume-unchanged file.csproj
, überprüft git file.csproj nicht automatisch auf Änderungen. Dadurch wird verhindert, dass sie bei jeder Änderung im git-Status angezeigt werden. Sie können also alle Ihre .csproj-Dateien auf diese Weise markieren - obwohl Sie alle neuen Dateien, die Ihnen das Upstream-Repo sendet, manuell markieren müssen. (Wenn Sie sie in Ihrem.gitignore
oder haben.git/info/exclude
, werden die von Ihnen erstellten ignoriert.)Ich bin mir nicht ganz sicher, was .csproj-Dateien sind ... Wenn es sich um IDE-Konfigurationen handelt (ähnlich den .eclipse- und .classpath-Dateien von Eclipse), würde ich vorschlagen, dass sie einfach niemals quellengesteuert werden sollten alle. Wenn sie jedoch Teil des Build-Systems sind (wie Makefiles), sollten sie dies eindeutig tun - und eine Möglichkeit, optionale lokale Änderungen (z. B. von einer local.csproj a la config.mk) zu übernehmen, wäre nützlich : Teilen Sie den Aufbau in globale Teile und lokale Überschreibungen auf.
quelle
.csproj
?git ls-files -v
Dateien an, die mit einem Kleinbuchstaben unverändert angenommen werden (z. B.h
anstelle vonH
für zwischengespeicherte Dateien üblichen ).Es gibt 3 Optionen, Sie möchten wahrscheinlich # 3
1. Dadurch bleibt die lokale Datei für Sie erhalten, sie wird jedoch für alle anderen Benutzer gelöscht, wenn diese ziehen.
git rm --cached <file-name>
odergit rm -r --cached <folder-name>
2. Dies dient zur Optimierung, z. B. für einen Ordner mit einer großen Anzahl von Dateien, z. B. SDKs, die sich wahrscheinlich nie ändern werden. Es weist git an, den riesigen Ordner jedes Mal lokal nicht mehr auf Änderungen zu überprüfen, da er keine hat. Der
assume-unchanged
Index wird zurückgesetzt und die Datei (en) überschrieben, wenn vorgelagerte Änderungen an der Datei / dem Ordner vorgenommen werden (beim Ziehen).3. Dies soll git mitteilen, dass Sie Ihre eigene unabhängige Version der Datei oder des Ordners möchten. Beispielsweise möchten Sie keine Produktions- / Staging-Konfigurationsdateien überschreiben (oder löschen).
Es ist wichtig zu wissen, dass sich
git update-index
das nicht mit git verbreitet, und jeder Benutzer muss es unabhängig ausführen.quelle
grep
undgit ls-files
it gives me error that your local changes would be overwritten
in diesen beiden Dateien wieder aus dem Git Origin-Repo ziehe, bedeutet das, dass er nicht entfolgt wird, oder?Dies ist ein zweistufiger Prozess:
Entfernen Sie die Verfolgung von Dateien / Ordnern, behalten Sie sie jedoch auf der Festplatte bei
Jetzt werden sie nicht als "geändert" angezeigt, sondern immer noch als
Fügen Sie sie hinzu
.gitignore
quelle
Die akzeptierte Antwort hat bei mir immer noch nicht funktioniert
ich benutzte
Habe die Antwort von hier gefunden
quelle
Hast du deinen .gitignore vergessen?
Wenn Sie das gesamte Projekt lokal haben, aber vergessen haben, es hinzuzufügen, ignorieren Sie git und verfolgen jetzt einige unnötige Dateien. Verwenden Sie diesen Befehl, um alles zu entfernen
Stellen Sie sicher, dass Sie an der Wurzel des Projekts sind.
Dann können Sie das Übliche tun
Hinzufügen
Verpflichten
drücken
Fazit
Ich hoffe, dies hilft Menschen, die Änderungen an ihren vornehmen
.gitignore
oder alles gemeinsam vergessen müssen.quelle
Wie in anderen Antworten ausgeführt, ist die ausgewählte Antwort falsch.
Die Antwort auf eine andere Frage deutet darauf hin, dass möglicherweise ein Sprungbaum erforderlich ist.
quelle
--skip-worktree
Wird verwendet, um die Datei im Repository zu behalten, aber die Änderungen nicht mehr zu verfolgen . Wie Ihre Antwort sagt: --skip-worktree ist nützlich, wenn Sie git anweisen, eine bestimmte Datei niemals zu berühren, weil Entwickler sie ändern sollten--assume-unchanged
und--skip-worktree
haben Sie einen ähnlichen Effekt, aber ihre Zwecke sind völlig unterschiedlich. Ersteres dient dazu, die Git-Leistung zu beschleunigen, indem Git getäuscht wird , um bestimmte Dateien nicht zu überprüfen , während letzteres dazu dient , zukünftige Änderungen an bestimmten Dateien zu ignorieren , die für die Laufzeit geeignet sind, aber wichtige Dateien.Um Zeit zu sparen, können die Regeln, die Sie Ihrem .gitignore hinzufügen, zum Entfernen mehrerer Dateien / Ordner verwendet werden, z
git rm --cached app/**/*.xml
oder
git rm --cached -r app/widgets/yourfolder/
usw
quelle
Um zu verhindern, dass eine Datei von git überwacht wird
Und um es wieder zu verwenden
Ein Repo für ähnliche Anwendungsfälle https://github.com/awslabs/git-secrets
quelle
Viele Leute raten Ihnen zu verwenden
git update-index --assume-unchanged
. Dies ist zwar eine gute Lösung, aber nur kurzfristig.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
. Sie behält Ihre lokale Datei bei, wird jedoch als aus dem Remote-Repository entfernt markiert.)Unterschied zwischen den ersten beiden Optionen?
assume-unchanged
Mit dieser Option können Sie Änderungen vorübergehend aus einer Datei ausblenden. Wenn Sie an einer Datei vorgenommene Änderungen ausblenden, die Datei ändern und dann einen anderen Zweigno-assume-unchanged
auschecken möchten, müssen Sie die vorgenommenen Änderungen verwenden.skip-worktree
wird Ihnen mit Ihren Änderungen folgen, egal in welcher Filiale Sie sich befinden!Anwendungsfall von
assume-unchanged
Es wird davon ausgegangen, dass diese Datei nicht geändert werden sollte, und Sie erhalten dabei eine sauberere Ausgabe
git status
. Wenn Sie jedoch in einen anderen Zweig auschecken, müssen Sie das Flag zurücksetzen und zuvor Änderungen festschreiben oder speichern. Wenn Sie mit aktivierter Option ziehen, müssen Sie Konflikte lösen, und Git wird nicht automatisch zusammengeführt. Tatsächlich werden nur Änderungen ausgeblendet (git status
die markierten Dateien werden nicht angezeigt).Ich verwende es gerne, wenn ich Änderungen nur für eine Weile nicht mehr verfolgen möchte + eine Reihe von Dateien (
git commit -a
) festschreiben möchte , die sich auf dieselbe Ä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, folgen Ihnen unabhängig von der Branche. Warnung: Wenn Ihre Freunde diese Klasse ebenfalls ändern möchten, müssen sie dasselbe Setup haben, andernfalls werden ihre Änderungen in das Remote-Repository übertragen. Beim Ziehen sollte die Remote-Version der Datei Ihre überschreiben.
PS: Machen Sie das eine oder andere, aber nicht beides, da Sie unerwünschte Nebenwirkungen haben. Wenn Sie ein anderes Flag ausprobieren möchten, sollten Sie dieses zuerst deaktivieren.
quelle
Um Git anzuweisen, Änderungen an Ihrer lokalen Datei / Ihrem lokalen Ordner nicht zu verfolgen (was bedeutet, dass der Git-Status keine Änderungen daran erkennt), gehen Sie wie folgt vor:
Und um Git anzuweisen, Änderungen an Ihrer lokalen Version erneut zu verfolgen (damit Sie die Änderungen festschreiben können), gehen Sie wie folgt vor:
quelle
einzeilige Antwort
git update-index --assume-unchanged [path]
Verwenden Sie diese Option, wenn Sie eine Datei haben, die sich im zentralen Repo und auch im lokalen Repo befindet. Sie müssen Änderungen in dieser Datei vornehmen, dürfen jedoch nicht für das zentrale Repo bereitgestellt / festgeschrieben werden. Diese Datei sollte nicht hinzugefügt werden
.gitignore
. Da neue Änderungen in der Datei von Systemadministratoren eingeführt werden, müssen ältere Entwickler auf alle lokalen Repos verteilt werden.Bestes Beispiel: Konfigurationsdatei für DB-Verbindungen . In einem zentralen Repo haben Sie alle Benutzernamen, Kennwörter, Hosts und Ports mit den Werten eines Produktions-DB-Servers. In lokalen Entwicklern sollten Sie jedoch nur einen lokalen oder einen anderen Entwicklungs-DB-Server verwenden (den Ihr Team eingerichtet hat). In diesem Fall möchten Sie Änderungen an der Konfigurationsdatei vornehmen, sollten sich jedoch nicht auf das zentrale Repo festlegen.
Beste
quelle
Ich gehe davon aus, dass Sie fragen, wie ALLE Dateien in einem bestimmten Ordner oder im Ordner bin entfernt werden sollen, 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 vorgibt, dass diese Dateien "gelöscht" werden und diese Dateien nicht verfolgt werden. Der Git markiert diese Dateien wirklich als gelöscht.
Stellen Sie sicher, dass Sie Ihren .gitignore für bevorstehende Commits bereit haben.
Dokumentation: git rm
quelle
Das Problem kann durch die Reihenfolge der Bedienung verursacht werden. Wenn Sie zuerst den .gitignore und dann git rm --cached xxx geändert haben, muss dieses Problem möglicherweise weiterhin auftreten.
Richtige Lösung:
Bestellinvariant!
Der .gitignore wird nach Änderung neu geladen!
quelle
Ich gehe davon aus, dass Sie versuchen, eine einzelne Datei aus dem Git-Tacking zu entfernen. dafür würde ich unten befehl empfehlen.
git update-index --assume-unverändert
Ex - git update-index --assume-unverändert .gitignore .idea / compiler.xml
quelle
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 "ausgeschlossen" der Name des Verzeichnisses, in dem keine Änderungen vorgenommen werden sollen.
Entfernen Sie zunächst alle vorhandenen neuen Dateien aus Ihrem Änderungsverfolgungscache (ohne sie aus Ihrem Dateisystem zu entfernen).
Sie können das gleiche mit tun
modified:
.renamed:
ist etwas komplizierter, da Sie im Post-->
Bit nach dem neuen Dateinamen suchen und das Pre-->
Bit wiedeleted:
unten beschrieben ausführen müssen.deleted:
Dateien erweisen sich als etwas komplizierter, da Sie den Index für eine Datei, die auf dem lokalen System nicht vorhanden ist, scheinbar nicht aktualisieren könnenMit dem letzten Befehl in der obigen Liste werden die Dateien wieder aus Ihrem Dateisystem entfernt. Sie können dies also weglassen.
Blockieren Sie dann die Änderungsverfolgung aus diesem Verzeichnis
quelle
In dieser Antwort wurde ein fast git-befehlsfreier Ansatz angegeben :
So ignorieren Sie bestimmte Dateien für jedes lokale Repo :
~/.gitignore_global
, z. B. vontouch ~/.gitignore_global
in Ihrem Terminal.git config --global core.excludesfile ~/.gitignore_global
einmal.~/.gitignore_global
. zBmodules/*.H
, von denen angenommen wird, dass sie sich in Ihrem Arbeitsverzeichnis befinden, dh$WORK_DIR/modules/*.H
.So ignorieren Sie bestimmte Dateien für ein einzelnes lokales Repo :
.git/info/exclude
innerhalb des Repos aus, dh schreiben Sie die Datei- / Verzeichnispfade, in die Sie ignorieren möchten.git/info/exclude
. zBmodules/*.C
, von denen angenommen wird, dass sie sich in Ihrem Arbeitsverzeichnis befinden, dh$WORK_DIR/modules/*.C
.quelle
Wenden Sie .gitignore auf die Gegenwart / Zukunft an
Wenn Sie auch die neu ignorierten Dateien aus dem Festschreibungsverlauf des Zweigs löschen müssen oder wenn Sie nicht möchten, dass die neu ignorierten Dateien aus zukünftigen Pulls gelöscht werden, lesen Sie diese Antwort .
quelle
Finden Sie nach langer Suche einen Weg, dies zu tun. Alias ein Git-Befehl in
.gitconfig
wie in Android Studio-Projekt , vor dem Checkout-Zweig die Konfigurationsdatei zurücksetzen und dann überspringen , nach dem Checkout-Zweig verwenden Siesed
die Konfigurationsdatei in meine lokale Konfiguration ändern.checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :
quelle