- Git hat drei Ebenen für Regeln zum Ignieren von Dateien, je nach Geltungsbereich:
.gitignore, .git/info/exclude und ~/.config/git/ignore
.gitignore wird zusammen mit dem Repository-Code committet und ist daher der richtige Ort für gemeinsame Regeln, die ein Team oder Projekt zusammen anwenden soll
- Einträge wie persönliche Dateien oder Dateien für lokale Arbeiten, die im Repository nicht nötig sind, sich aber schlecht als Team-Regel eignen, passen besser in
.git/info/exclude
- Dateien, die in allen Repositories immer wieder ausgeschlossen werden sollen, wie
.DS_Store unter macOS, kann man in die maschinenweite Ignore-Datei ~/.config/git/ignore eintragen
git check-ignore -v <Dateiname> ist nützlich, um nachzuverfolgen, welche Regel eine Datei ignoriert; gibt es keine passende Regel, erfolgt keine Ausgabe
Wo Git Ignore-Regeln angewendet werden
- Git kann Regeln zum Ignieren von Dateien an drei Stellen verarbeiten
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore: Gemeinsame Regeln, die ins Repository committet werden
.gitignore ist die übliche Datei, in der Dateinamen eingetragen werden, die ignoriert werden sollen
- Sie wird zusammen mit dem restlichen Code in Git eingecheckt
- Dateien, die auf Regeln in
.gitignore passen, werden bei der Ausführung von git-Befehlen nicht berücksichtigt
.git/info/exclude: Persönliche Regeln pro Repository
- Die Datei
exclude befindet sich im .git-Verzeichnis jedes Git-Repositories
- Änderungen an dieser Datei werden nicht in Git eingecheckt
- In neuen Git-Repositories enthält sie normalerweise ein paar Kommentarzeilen
- Sie eignet sich für Dateien, die nur in diesem Repository ignoriert werden sollen, aber nicht in
.gitignore gehören
- Beispiel: Wenn du
notes.txt, das du nur für deinen persönlichen Workflow brauchst, weder in das Repository committen noch zur .gitignore des Projekts hinzufügen willst, trägst du notes.txt in .git/info/exclude ein
~/.config/git/ignore: Maschinenweite Regeln
- Die globale
ignore-Datei liegt im Home-Verzeichnis unter ~/.config/git/ignore
- Dateinamen, die hier hinzugefügt werden, werden maschinenweit global ignoriert
- Sie wird nicht in Git eingecheckt und ist nicht mit einem bestimmten Repository verknüpft
- Das ist ein guter Ort für Dateien, die du in allen Git-Repositories auf deinem Computer ignorieren willst
- Beispiel: Unter macOS ist es sinnvoll,
.DS_Store hier einzutragen
Pfad der globalen Ignore-Datei ändern
- Die globale Ignore-Datei kann auch auf eine andere Datei gesetzt werden
- Wenn du
.gitignore_global als globale Git-Ignore-Datei verwenden willst, führe den folgenden Befehl aus
git config --global core.excludesFile ~/.gitignore_global
- Um zur Standardeinstellung zurückzukehren, führe den folgenden Befehl aus
git config --global --unset core.excludesFile
Prüfen, welche Regel eine Datei ignoriert
- Mit
git check-ignore -v <Dateiname> kannst du prüfen, durch welche Regel eine bestimmte Datei ignoriert wird
- Um zu prüfen, wie
.DS_Store ignoriert wird, führe im Git-Repository den folgenden Befehl aus
git check-ignore -v .DS_Store
- Wenn
.gitignore des Repositories .DS_Store ignoriert, sieht die Ausgabe zum Beispiel so aus
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- Wenn
.git/info/exclude des Repositories .DS_Store ignoriert, sieht die Ausgabe zum Beispiel so aus
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- Wenn die globale Datei
~/.config/git/ignore .DS_Store ignoriert, sieht die Ausgabe zum Beispiel so aus
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- Wenn die benutzerdefinierte globale Ignore-Datei
.gitignore_global .DS_Store ignoriert, sieht die Ausgabe zum Beispiel so aus
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- Wenn es keine Regel gibt, die eine bestimmte Datei ignoriert, liefert der Befehl
git check-ignore -v keine Ausgabe
3 Kommentare
Es wäre wohl auch nützlich, Dinge wie Arbeits-Specs oder die Datei
plan.mdin.git/info/excludeaufzunehmen.Es gab also doch eine Einstellung im Root, haha.
Hacker-News-Kommentare
Interessanter Artikel, aber es fehlt
.gitattributes, meine liebste Funktion zum fast Ignorieren in Git.Damit kann man festlegen, dass Git Unterschiede in bestimmten Dateien „ignoriert“. In einem Node-Projekt ist zum Beispiel
package-lock.jsonaus Git-Sicht fast nur Rauschen. Man bekommt riesige Diffs mit konkreten Bibliotheksversionen, während die eigentlichen, für Menschen gut lesbaren Versionsinformationen separat inpackage.jsonstehen.Fügt man im Projekt-Root in
.gitattributeseinfach die Zeilepackage-lock.json -diffhinzu, wird die Datei weiterhin gestaged/committet, aber ingit differscheinen keine bedeutungslosen riesigen Unterschiede mehr.package-lock.jsonsollte kein Rauschen sein. Wenn man es nicht absichtlich aktualisieren will, sollte man es nicht ändern, sonst setzt man sich ohne Grund einem Supply-Chain-Risiko aus.Wenn Änderungen an
package-lock.jsonhäufig unerwartet auftauchen, macht man irgendetwas falsch.package-lock.jsonzeigt alle transitiven Abhängigkeiten,package.jsondagegen nur direkte Abhängigkeiten. Deshalb stimmt die Aussage nicht, Letzteres enthalte die „echten, menschenlesbaren Versionen“.Beide haben unterschiedliche Zwecke, und zu sagen, man könne Diffs der Lock-Datei immer ignorieren, ist gefährlich.
git diffkeine Unterschiede in der Lock-Datei zeigt.Ich verstehe, dass es wie zeilenweises Rauschen wirkt, aber wenn man es braucht, braucht man es wirklich.
Ausschlussregeln auf globaler/Benutzerebene sollten viel bekannter sein. Ich bekomme oft Änderungen, die IDE-/OS-/AI-bezogene Dateien in die
.gitignorealler Projekte aufnehmen wollen. Wenn man erklärt, dass man sie stattdessen in die Standardkonfiguration setzen kann, sodass sie überall ignoriert werden, ohne jedes Projekt anzufassen, und dass man dann auch nicht riskiert, sie versehentlich in Projekte ohne aktualisierte.gitignorezu committen, reagieren die meisten positiv.Meine persönliche Regel ist,
.gitignoreim Repository nur für Repository-spezifische Einträge wie Build-Artefakte oder Abhängigkeitsordner zu verwenden; die meisten Benutzerwerkzeuge sollten in die jeweilige Benutzerkonfiguration..gitignoreimmer wieder erklären muss, ist die natürliche Folge des Prinzips, die.gitignoreim Repository nur für Repository-spezifische Einträge zu verwenden.Wenn alle weniger Zeit verschwenden sollen, ist es besser, solche Dateien einfach in allen Projekten in
.gitignorezu packen..gitignoredes Projekts aufgenommen, damit niemand aus Unwissenheit solche Dateien zum Projekt hinzufügt.Am Ende würde man sie sowieso wieder aus Git entfernen und der Person damit Schmerzen bereiten, also habe ich das aus Höflichkeit von vornherein verhindert. Vielleicht bin ich in Zukunft weniger höflich.
gitignore-Variante, weil sie auch einen Neuaufbau von Development-Containern überlebt.Wenn man
gitignorevermeiden will, kann man die Konfiguration zwar über Generierungsskripte oder Volumes wiederherstellen/beibehalten, aber dann braucht man statt einer Zeile in.gitignorezusätzliche Skripte oderdevcontainer-Mount-Konfiguration.Für globale Git-Konfiguration und Ignore-Dateien halte ich
~/.config/git/ignoreund~/.config/git/configfür richtiger als~/.gitignore_globalplus geänderte Einstellungen.Wenn man
~/.config/für mehrere Zwecke nutzt, werden die Dotfiles auf Root-Ebene viel kleiner.Git exclude wird wohl deshalb seltener genutzt, weil es nicht ins Repository committet wird und man es daher jedes Mal neu anlegen muss, wenn man es verwenden will. Das soll nicht heißen, dass es schlecht ist; nur deshalb wird es weniger verwendet.
~/.configunter Versionskontrolle stellt, lassen sich spätere Änderungen und das Teilen vereinfachen.~/.cvsignorenutzen.Ich weiß nicht mehr, wo ich das gelernt habe, aber ich habe
atticzu meinem globalen Git-Ignore hinzugefügt.So kann ich in jedem Projekt ein Verzeichnis
atticanlegen, um allerlei Dinge abzulegen, die auf keinen Fall committet werden dürfen. Ein Repository, das tatsächlich nach solchen Verzeichnissen sucht, ist mir noch nicht begegnet.Wenn es ein Verzeichnis wie
atticgibt, kann man darinattic/.gitignoremit/**anlegen; dann werden das Verzeichnis und alles darin ignoriert, inklusive der Ignore-Datei selbst.Normalerweise benenne ich meine Version dieses Verzeichnisses mit einem einzelnen U+1F4A9-Zeichen, aber HN erlaubt das in Kommentaren nicht.
aux.Wenn ich darin eine
.gitignoremit nur einem Stern*ablege, wird sie selbst und alles darin ignoriert..local.scratch/.Das hat mir bisher noch keine Probleme gemacht.
Bei benutzerspezifischen Ignore-Regeln gilt für macOS:
.DS_Storedort hinzuzufügen ist zwar ideal, aber dann müssten das alle Mac-Nutzer des Projekts tun.Wenn es mehr als einen gibt, ist es vielleicht besser, das nicht jedem selbst zu überlassen.
~/.gitignore_globaleinen Eintrag für.DS_Store, und in der globalen Git-Konfiguration ist eingestellt, dass die Einträge dieser Datei ignoriert werden.Das Datum dieser Datei auf dem neuen Mac liegt zwei Tage vor der Bestellung, und ich kann mich nicht erinnern, das selbst eingerichtet zu haben, daher scheint sie standardmäßig vorhanden gewesen zu sein. Ich vermute, auf dem alten Mac war es ähnlich; angesichts der macOS-Versionen könnte das also schon seit geraumer Zeit die Voreinstellung sein.
Vielleicht ist die Zeit also vorbei, in der man
.DS_Store/zu.gitignorehinzufügen musste.Wow, wie konnte ich das nicht wissen? Ich bin seit 20 Jahren professioneller Softwareentwickler und habe immer nur
.gitignoreverwendet.Mir wird gerade klar, dass ich mich nie gefragt habe, ob es einen besseren Weg gibt, als
.gitignoremit allen möglichen Ausschlüssen vollzustopfen, die nur für mich relevant sind. Ich habe die Welt einfach so akzeptiert, wie sie sich gezeigt hat.Heute ist die Welt ein kleines bisschen besser geworden.
Ich benutze
.git/info/excludewirklich oft. Das passt hervorragend für Skripte/Makefile, die nur lokal verwendet werden und die Mitarbeitende weder brauchen noch verwenden können.git statusangezeigten untracked Dateien direkt nach.git/info/excludeschiebt.Meistens wende ich sie an, nachdem ich die Dinge, die tatsächlich ins Repository sollen, per
addundcommitübernommen habe.In Projektverzeichnissen mit mehreren Repositories nutze ich Excludes-Dateien so, um projektbezogene Git-Konfigurationen unterschiedlich anzuwenden.
https://laszlo.nu/blog/project-level-git-config.html
Dazu habe ich einige Aliase im Einsatz.
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"Für bereits verfolgte Dateien gibt es auch
git update-index --[no]-skip-worktree.Das kann für lokale Experimente nützlich sein, aber Git macht diese Funktion nicht gerade gut sichtbar, daher ist ihre Nutzung etwas umständlich. Man muss sich merken, dass man sie gesetzt hat, und wenn man das vergisst, können andere Vorgänge wie ein Checkout blockiert werden.