guide

.gitignore-Mustersyntax im Überblick

Die gitignore-Mustersyntax mit Beispieltabellen: Kommentare, Escaping und nachgestellte Leerzeichen, Negation mit !, abschließender Schrägstrich, Verankerung, die Platzhalter *, ? und [] sowie die Regeln für **.

Jede Zeile einer .gitignore ist ein Muster. Die Syntax ähnelt Shell-Globs, doch ihre Bedeutung hängt stark von der Position der Schrägstriche und der Position von ** ab. Die folgenden Angaben stützen sich auf die offizielle git-Dokumentation gitignore(5); die Beispiele wurden mit git 2.50 direkt überprüft.

Leerzeilen, Kommentare, Escaping

Nachgestellte Leerzeichen sind unsichtbar und daher eine häufige Fehlerquelle. Wenn eine Regel nicht greift, schalten Sie im Editor die Anzeige von Leerzeichen ein. Beachten Sie auch, dass nur Leerzeichen entfernt werden, Tabulatoren dagegen nicht.

Abschließender Schrägstrich: nur Verzeichnisse

Endet ein Muster auf /, passt es nur auf Verzeichnisse. build/ ignoriert das Verzeichnis build samt Inhalt, aber keine Datei namens build. Schreiben Sie dagegen build ohne Schrägstrich, passt es auf Dateien und Verzeichnisse dieses Namens.

Ein Schrägstrich fixiert die Position

Enthält das Muster – ohne den abschließenden Schrägstrich – ein / am Anfang oder in der Mitte, passt es nur auf Pfade relativ zu dem Verzeichnis, in dem die .gitignore liegt. Das nennt man üblicherweise Verankerung (anchoring). Ohne / sucht git in jeder Tiefe unterhalb des Speicherorts der .gitignore nach passenden Namen.

MusterPasst aufPasst nicht auf
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/logs/debug.log
doc/frotz/Verzeichnis doc/frotz/a/doc/frotz/
frotz/Verzeichnisse frotz/, a/frotz/Datei frotz

Die dritte Zeile ist besonders verwirrend. logs/debug.log enthält in der Mitte einen Schrägstrich, ist also an der Wurzel verankert und bedeutet dasselbe wie mit vorangestelltem /. Um logs/debug.log in jeder Tiefe zu erfassen, verwenden Sie **/logs/debug.log.

Platzhalter: *, ?, [ ]

Der doppelte Stern **

** hat nur in Verbindung mit einem Schrägstrich eine besondere Bedeutung.

FormBedeutungBeispiele
**/foofoo in jeder Tiefefoo, a/foo, a/b/foo
**/logs/debug.loglogs/debug.log in jeder Tiefelogs/debug.log, app/logs/debug.log
abc/**alles innerhalb von abcabc/x, abc/x/y (nicht aber abc selbst)
a/**/bnull oder mehr Verzeichnisse dazwischena/b, a/x/b, a/x/y/b

An anderen Stellen, etwa in foo** oder **bar, verhält sich ** wie ein gewöhnliches * und überschreitet keine Schrägstriche. docs/**/*.pdf passt sowohl auf docs/manual.pdf als auch auf docs/a/b/manual.pdf, weil /**/ auch auf null Verzeichnisse passt.

Zusammenfassung an einem kleinen Beispiel

# Build-Ergebnisse (nur das build-Verzeichnis im Wurzelverzeichnis)
/build/

# Logdateien in jeder Tiefe, wichtige Logs bleiben erhalten
*.log
!important.log

# Alle PDFs unterhalb von docs
docs/**/*.pdf

# Datei, deren Name mit # beginnt
\#scratch.md
PfadErgebnisEntscheidende Regel
build/app.jsignoriert/build/
src/build/app.jsverfolgtkeine
logs/server.logignoriert*.log
logs/important.logverfolgt!important.log
docs/api/v1.pdfignoriertdocs/**/*.pdf
#scratch.mdignoriert\#scratch.md

Diese Tabelle lässt sich genau reproduzieren, indem Sie Regeln und Pfade in den Tab Mustertest des Generators einfügen.

Quellen

← ZurückWas ignorieren, was committen?