Wie lässt man Git Dateien ignorieren, ohne .gitignore zu verwenden?

132

Aufgrund externer seltsamer Einschränkungen kann .gitignoreich das Repository nicht ändern . Gibt es eine andere Möglichkeit, Dateien und Verzeichnisse zu ignorieren, als a zu ändern .gitignore? Auch wenn es sich um eine globale Lösung wie eine globale Konfiguration handelt, die auf alle meine Repositorys angewendet wird.

pupeno
quelle

Antworten:

178

Vergessen Sie laut gitignore nicht , dass die verschiedenen " Musterquellen ignorieren", die Git berücksichtigt, eine Rangfolge haben:

  • In der Befehlszeile werden Muster für die Befehle gelesen, die sie unterstützen.
  • Muster, die aus einer Gitignore-Datei im selben Verzeichnis wie der Pfad oder in einem übergeordneten Verzeichnis gelesen werden, wobei Muster in den Dateien höherer Ebene (bis zum Stammverzeichnis) von denen in Dateien niedrigerer Ebene bis in das Verzeichnis, in dem sich die Datei befindet, überschrieben werden.
  • Muster lesen aus $GIT_DIR/info/exclude.
  • Muster, die aus der von der Konfigurationsvariablen angegebenen Datei gelesen werden core.excludesfile.

Die letzten beiden können eine Lösung für Ihr Problem sein, aber:

  • Sie werden nicht für ein entferntes Repository repliziert
  • Sie können ihre Muster von den anderen Quellen überschreiben lassen

(Siehe auch diese SO-Frage )


Bei den beiden anderen Lösungen wird der Index ( git update-index) aktualisiert :

Wenn Sie jedoch einen anderen Zweig auschecken oder wenn Sie git pulldies tun, wird dieser Status "Ignorieren" möglicherweise zurückgesetzt. Daher die andere Option:

Der Unterschied zwischen den beiden wird in " Git - Unterschied zwischen ' assume-unchanged' und ' skip-worktree' " erklärt.

VonC
quelle
Sie können update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn
1
@ ElijahLynn sicher. Sie haben auch update-index --skip-work-tree. Ich habe die Antwort bearbeitet, um einige Links zu meinen alten Antworten hinzuzufügen, die diese beiden update-indexBefehle veranschaulichen .
VonC
140

Wenn Sie Änderungen .git/info/excludevornehmen können, können Sie dort dieselben Regeln festlegen. Diese Datei befindet sich jedoch nur in Ihrem lokalen Repo.

Ólafur Waage
quelle
Es klingt so, als wäre dies wahrscheinlich die beste Wahl. Lassen Sie uns Dateien aus Ihrem lokalen Repository ausschließen.
Abizern
1
Wie funktioniert das mit Submodulen? Es gibt kein .gitVerzeichnis in einem Submodul ...
zakdances
10
@yourfriendzak Der .gitOrdner eines Submoduls befindet sich tatsächlich in parent_repo/.git/modules/submodule_name. Also würden Sie bearbeitenparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell
25

Es gibt drei Möglichkeiten, GIT mitzuteilen, welche Dateien ignoriert werden sollen:

  • .gitignore Dateien
  • $GIT_DIR/.git/info/exclude
  • Dateien, auf die über die core.excludesfileEinstellung verwiesen wird

Die letzten beiden Punkte könnten Ihr Problem lösen.

Weitere Informationen finden Sie unter Gitignore (5) .

Ferdinand Beyer
quelle
5

Wenn Sie nur einige lokale Dateien im Repository haben möchten und der Speicherort des Unterverzeichnisses flexibel ist, können Sie Ihre Dateien einfügen tracked_dir1/tracked_dir2/untracked_dir/und dann eine tracked_dir1/tracked_dir2/untracked_dir/.gitignoremit folgenden Inhalten hinzufügen :

*

Dh

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
quelle
4

Ich war in ähnlichen Situationen und füge meine bevorzugte Lösung hinzu, die ich nicht erwähnt sehe. Das Problem git update-index --assume-unchangedin diesem Fall ist, dass Sie dies für eine nicht verfolgte Datei nicht tun können. Du sagtest

Ich kann den Gitignore meines Repositorys nicht ändern.

Ich gehe davon aus, dass Sie damit keine Änderungen an .gitignoreder Herkunft vornehmen können . Wenn dies der Fall ist, können Sie die nicht verfolgte Datei zu Ihrer lokalen Datei hinzufügen .gitignore, git update-index --assume-unchanged .gitignoredamit Ihre Änderung an .gitignoreniemals verschoben wird. Jetzt ignorieren Sie die (möglicherweise) nicht verfolgte Datei und haben keinen Einfluss auf die entfernte .gitignoreDatei.

Tony
quelle
3

Ignorieren Sie lokale Änderungen an verfolgten Dateien: git update-index --assume-unchanged my-file.php

Lokale Änderungen an verfolgten Dateien aufheben: git update-index --no-assume-unchanged my-file.php

Quelle: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.
Elijah Lynn
quelle
1

Ein anderer Weg:

  • lokal bearbeiten .gitignore
  • dann git update-index --assume-unchanged .gitignore
langpavel
quelle