Wie konfiguriere ich git so, dass einige Dateien lokal ignoriert werden?

1350

Kann ich Dateien lokal ignorieren, ohne die globale Git-Konfiguration für alle anderen zu verschmutzen? Ich habe nicht verfolgte Dateien, die in meinem Git-Status Spam sind, aber ich möchte keine Änderungen an der Git-Konfiguration für jede einzelne kleine zufällige nicht verfolgte Datei vornehmen, die ich in meinen lokalen Zweigen habe.

Björn
quelle

Antworten:

1863

Aus der entsprechenden Git-Dokumentation :

Muster, die für ein bestimmtes Repository spezifisch sind, aber nicht für andere verwandte Repositorys freigegeben werden müssen (z. B. Hilfsdateien, die sich im Repository befinden, aber für den Workflow eines Benutzers spezifisch sind), sollten in die $GIT_DIR/info/excludeDatei aufgenommen werden.

Die .git/info/excludeDatei hat das gleiche Format wie jede .gitignoreandere Datei. Eine andere Möglichkeit besteht darin core.excludesFile, den Namen einer Datei festzulegen, die globale Muster enthält.

Hinweis: Wenn Sie bereits nicht bereitgestellte Änderungen vorgenommen haben, müssen Sie nach dem Bearbeiten Ihrer Ignoriermuster Folgendes ausführen:

git update-index --assume-unchanged <file-list>

Hinweis zu$GIT_DIR : Dies ist eine Notation, die im gesamten Git-Handbuch verwendet wird, um lediglich den Pfad zum Git-Repository anzugeben. Wenn die Umgebungsvariable festgelegt ist, überschreibt sie den Speicherort des Repos, in dem Sie sich befinden. Dies ist wahrscheinlich nicht das, was Sie möchten.


Bearbeiten : Eine andere Möglichkeit ist zu verwenden:

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

Umkehren durch:

git update-index --no-skip-worktree <file-list>
Josh Lee
quelle
204
Stellen Sie als Hinweis sicher, dass die Ausführung ausgeführt wird, git update-index --assume-unchanged [<file>...]nachdem Sie die Ausschlussdatei hinzugefügt haben. Die Änderungen werden bis dahin nicht übernommen.
Tollmanz
30
Ich musste 'git update-index ...' nicht ausführen, damit die Änderungen mit git 1.7.9.5 wirksam werden.
Jeffrey Martinez
39
Sie müssen git update-index nur verwenden, wenn Sie bereits eine Änderung an der Datei vorgenommen haben und diese nun ignorieren möchten. Wenn Sie vor dem Ändern den Ausschluss ändern, ist dies nicht erforderlich.
Brady Emerson
13
Während dies verhindert, dass die Datei während Commits wie .gitignore als geändert angezeigt wird, werden die Dateien im Gegensatz zu ignorierten Dateien immer noch auf die Repo-Version zurückgesetzt, wenn Sie git reset --hard ausführen.
Brady Emerson
19
Per stackoverflow.com/questions/23097368/... und stackoverflow.com/questions/13630849/... , skip-worktreewürden bevorzugt wahrscheinlich assume-unchanged.
DanShumway
436

Update : Verwenden Sie git update-index --skip-worktree [<file>...]stattdessen @danShumway! Siehe Borealids Erklärung zum Unterschied der beiden Optionen .


Alte Antwort:

Wenn Sie lokale Änderungen an nachverfolgten Dateien ignorieren müssen (wir haben diese mit lokalen Änderungen an Konfigurationsdateien), verwenden Sie git update-index --assume-unchanged [<file>...].

Florian Sesser
quelle
8
Zu beachten ist, dass ich $ GIT_DIR / info / exclude (z. B. my-file.php) eine Datei hinzugefügt habe und diese dann ausführen musste, git update-index --assume-unchanged my-file.phpdamit sie ignoriert wird. Danke für den Tipp!
Tollmanz
78
Um es rückgängig zu machen: git update-index --no-assume-unchanged my-file.php
Ray
18
Nur zur Verdeutlichung: Angenommen, unverändert gilt für nachverfolgte Dateien (im Repo vorhanden) ... OP hat nach UNtracked-Dateien gefragt. In diesem Fall .git/info/excludemöchten Sie (um zu vermeiden, dass der häufig freigegebene und nachverfolgte .gitignore verschmutzt wird)
dyodji
7
Laut stackoverflow.com/questions/23097368/… gilt dies als unsicher, und Ihre Dateien werden möglicherweise trotzdem festgeschrieben, wenn Sie nicht vorsichtig sind. Es ist als Leistungshilfe gedacht, nicht als narrensichere Lösung für dieses Problem.
DanShumway
3
Ich beeilte mich, --assume-unchangedbevor ich Ihr Update las . Ich löste mich mit --no-assume-unchangedund tat dann das --skip-worktree... Bin ich im klaren?
Nicolas Miari
162

Fügen Sie die folgenden Zeilen zum Abschnitt [Alias] Ihrer .gitconfig-Datei hinzu

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Jetzt können Sie git ignore my_fileÄnderungen an der lokalen Datei git unignore my_fileignorieren und das Ignorieren der Änderungen beenden. git ignoredlistet die ignorierten Dateien auf.

Diese Antwort wurde von http://gitready.com/intermediate/2009/02/18/temporARY-ignoring-files.html abgerufen .

Phatmann
quelle
1
"! git ls-files -v | grep" ^ [[: lower:]] "- Gibt es eine Chance, dass Sie wissen, wie man das unter Windows cmd macht?
Haohmaru
3
Installiere eine echte Shell (zum Beispiel bietet Babun bash oder zsh an);) Ich kenne deine Gefühle, aber ich habe kürzlich von Windows zu Linux gewechselt und würde cmd nie wieder verwenden.
Xerus
@Haohmaru, Sie könnten immer WSL (Windows Subsystem für Linux) verwenden.
A Sz
110

Sie haben mehrere Möglichkeiten:

  • Lassen Sie eine schmutzige (oder nicht festgeschriebene ) .gitignoreDatei in Ihrem Arbeitsverzeichnis (oder wenden Sie sie automatisch mit topgit oder einem anderen solchen Patch-Tool an).
  • Fügen Sie die Ausschlüsse in Ihre $GIT_DIR/info/excludeDatei ein, wenn dies für einen Baum spezifisch ist.
  • Führen Sie aus git config --global core.excludesfile ~/.gitignoreund fügen Sie Ihrem Muster Muster hinzu ~/.gitignore. Diese Option gilt, wenn Sie bestimmte Muster in allen Bäumen ignorieren möchten . Ich benutze dies zum Beispiel für .pycund .pyoDateien.

Stellen Sie außerdem sicher, dass Sie Muster verwenden und Dateien gegebenenfalls nicht explizit auflisten.

Emil Setz dich
quelle
10
Ich denke, Sie müssen git config --globaldie Option global festlegen.
Josh Lee
7
Füge einfach .gitignore zu .gitignore hinzu;)!
Dominik George
68

Ich denke, Sie suchen:

git update-index --skip-worktree FILENAME

die lokale Änderungen ignorieren

Hier finden Sie http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ Weitere Erklärungen zu dieser Lösung!

Verwendung rückgängig machen:

git update-index --no-skip-worktree FILENAME
Piotr Korlaga
quelle
9
Es gibt eine relevante Diskussion zwischen --skip-worktreeund --assume-unchangedbei dieser SO-Frage
Merwer
1
Wie würde ich dies rückgängig machen oder die Liste der Dateien / Muster anzeigen, über die derzeit ignoriert wird --skipworktree, sollte ich später meine Meinung ändern und die Datei erneut verfolgen wollen?
Anomalie
1
Wie mache ich das rückgängig?
user1735921
3
Zum Rückgängigmachen verwenden Sie bittegit update-index --no-skip-worktree <file>
user1735921
49

Sie können einige Git-Aliase installieren , um diesen Vorgang zu vereinfachen. Dadurch wird der [alias]Knoten Ihrer .gitconfigDatei bearbeitet .

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Die Verknüpfungen, die hiermit für Sie installiert werden, lauten wie folgt:

  • git ignore config.xml
    • git wird so tun, als würde es keine Änderungen sehen config.xml- und Sie daran hindern, diese Änderungen versehentlich zu übernehmen.
  • git unignore config.xml
    • git bestätigt weiterhin Ihre Änderungen an config.xml- damit Sie diese Änderungen erneut festschreiben können.
  • git ignored
    • git listet alle Dateien, die Sie "ignorieren", auf die oben beschriebene Weise auf.

Ich habe diese unter Bezugnahme auf Phatmanns Antwort erstellt, die eine --assume-unchangedVersion derselben darstellt.

In der von mir vorgestellten Version werden --skip-worktreelokale Änderungen ignoriert. Siehe Borealid Antwort für eine vollständige Erklärung des Unterschieds, aber im Wesentlichen --skip-worktreeist Zweck ist für Entwickler zu ändern Dateien , ohne das Risiko ihre Änderungen kommen .

Der git ignoredhier vorgestellte Befehl verwendet git ls-files -vund filtert die Liste, um nur die Einträge anzuzeigen, die mit dem STag beginnen. Das STag kennzeichnet eine Datei mit dem Status "Arbeitsbaum überspringen". Eine vollständige Liste der Dateistatus finden Sie unter git ls-files: Informationen zur -tOption finden Sie in der Dokumentation git ls-files.

Birchlabs
quelle
1
Dies funktioniert nicht für nicht verfolgte Dateien: <(Git 2.13.5 auf OSX)
Terra Ashley
Ist der '!' soll drin sein '!git ls-files -v | grep "^S"'? Der Befehl funktioniert bei mir dort nicht .. und scheint gut zu funktionieren, wenn er entfernt wurde.
Tiris
Das Ausrufezeichen in einem Git-Alias ​​weist Git an, einen externen Befehl anstelle eines Git-Unterbefehls auszuführen . Ich habe es eingefügt, weil ich eine Shell-Pipeline benötige, also muss ich git von außen aufrufen. Ich habe gerade versucht , das Ausrufezeichen zu entfernen (wie pro Ihre Empfehlung), aber das tut nicht Arbeit für mich. Ich verstehe Expansion of alias 'ignored' failed; 'git' is not a git command. Das macht Sinn; ohne das Ausrufezeichen: git aliasiert Ihren Befehl an git git ls-files ….
Birchlabs
Danke für die Erklärung. Ich bin mit Git-Alias ​​nicht vertraut und habe gerade eine Shell ausgeführt, um sie zu testen, bevor ich den Alias ​​erstellt habe.
Tiris
Dies ist eine brillante Lösung. Da Git-Tracks pro Verzeichnis ausgeführt werden, git ignore <filename>gilt dies nur für dieses Verzeichnis , wenn Sie den obigen Alias ​​ausführen . Und wenn Sie endlich Ihre Änderungen an dieser Datei vornehmen und festschreiben und auf Remote übertragen möchten, verwenden Sie einfach das Handy, git unignore <filename>um sie vorübergehend erneut zu verfolgen! Vielen Dank!
Nickang
42

Sie können einfach eine .gitignore-Datei zu Ihrem Home-Verzeichnis hinzufügen, dh $HOME/.gitignoreoder ~/.gitignore. Dann weisen Sie git an, diese Datei mit dem folgenden Befehl zu verwenden:

git config --global core.excludesfile ~/.gitignore

Dies ist eine normale .gitignore-Datei, auf die git verweist, wenn entschieden wird, was ignoriert werden soll. Da es sich in Ihrem Home-Verzeichnis befindet, gilt es nur für Sie und verschmutzt keine .gitignore-Projektdateien.

Ich verwende diesen Ansatz seit Jahren mit großartigen Ergebnissen.

JESii
quelle
Danke, @EricChen. Ich habe die Antwort aktualisiert. Probieren Sie es aus und verwenden Sie es dann git check-ignore <file-name>zur Überprüfung. LMK, wenn es für Sie funktioniert
JESii
Es funktionierte nur für mich ohne =:git config --global core.excludesfile ~/.gitignore
E. Sundin
Ich habe eine .gitignoreDatei in das Home-Verzeichnis gestellt und git angewiesen, diese Datei stattdessen zu verwenden. Dann habe ich die Dateien gelöscht, die ich lokal entfernen möchte. Nachdem ich die Änderungen übernommen habe, hat das Remote-Repository diese Dateien jedoch auch gelöscht. Habe ich etwas falsch gemacht?
Zyy
Wow, @xyz; .gitignoreHier geht es darum, Dateien zu ignorieren, die in Ihrem lokalen Verzeichnis vorhanden sind. Was Sie hätten tun sollen, ist git rm --cached, sie aus dem Repo zu entfernen, sie aber in Ihrer Nähe zu belassen. Sie sollten in der Lage sein, zu Ihrem vorherigen Commit zurückzukehren git reset --soft HEAD^, indem Sie dieses Commit rückgängig machen und Ihre Dateien wiederherstellen. Das ist das Schöne an Git: Es ist alles noch da in deiner Git-Geschichte.
JESii
2

Um nicht verfolgte Dateien zu ignorieren, insbesondere wenn sie sich in (einigen) Ordnern befinden, die nicht verfolgt werden, besteht eine einfache Lösung darin .gitignore, jedem nicht verfolgten Ordner eine Datei hinzuzufügen und eine einzelne Zeile *gefolgt von einer neuen Zeile einzugeben . Es ist eine wirklich einfache und unkomplizierte Lösung, wenn sich die nicht verfolgten Dateien in wenigen Ordnern befinden. Für mich kamen alle Dateien aus einem einzigen nicht verfolgten Ordner vendorund die oben genannten funktionierten einfach.

aak318
quelle
1
Großartig! Zu Ihrer Information: Dies funktioniert nur, weil Git nur Dateien verfolgt (und festschreiben lässt), keine Ordner.
jmiserez
-2

Wenn Ihr Repo noch keine .gitignore-Datei hat, besteht eine einfache Lösung darin, eine .gitignore-Datei zu erstellen und diese .gitignorezur Liste der zu ignorierenden Dateien hinzuzufügen .

Gavin S. Yancey
quelle
4
Und was ist, wenn das Team dann hinzufügen möchte, um später einen Gitignore hinzuzufügen? Funktioniert das überhaupt? Klingt nach einer schrecklichen Idee und nach etwas, das nicht einmal funktionieren sollte.
Björn
Die Antwort dieses Typen hat mich verrückt gemacht. Auf keinen Fall macht das jemand.
Martyn Chamberlin
Dies ist eine schnelle und einfache Lösung, solange es einen Platz gibt, an dem sie abgelegt werden kann. Unser Repo hat oben eine gemeinsam genutzte .gitignoreDatei. Aber meine schmutzigen Dateien befinden sich in einem tiefen Ordner, deshalb habe ich meine eigenen .gitignoredaneben hinzugefügt . +1
joeytwiddle