.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
- Eine Leerzeile passt auf nichts. Sie dient als Trenner für bessere Lesbarkeit.
- Eine Zeile, die mit
#beginnt, ist ein Kommentar. Um eine Datei zu ignorieren, deren Name mit#beginnt, setzen Sie einen Backslash davor, etwa\#. - Nachgestellte Leerzeichen am Zeilenende werden ignoriert. Brauchen Sie einen Dateinamen, der auf ein Leerzeichen endet, schützen Sie das Leerzeichen mit einem Backslash wie in
foo\. Leerzeichen am Zeilenanfang bleiben Teil des Musters. - Eine Zeile, die mit
!beginnt, ist ein Negationsmuster. Für eine Datei, deren Name mit!beginnt, schreiben Sie\!important.txt.
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.
| Muster | Passt auf | Passt nicht auf |
|---|---|---|
debug.log | debug.log, logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/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: *, ?, [ ]
*passt auf jede Zeichenfolge außer/(einschließlich der leeren Zeichenfolge).*.logpasst aufapp.logunda/b/app.log,logs/*.logdagegen nur auflogs/app.logund nicht auflogs/2026/app.log.?passt auf genau ein Zeichen außer/.file?.txtpasst auffile1.txt, aber nicht auffile10.txt.[a-z]passt auf ein Zeichen innerhalb des Bereichs,[!a-z]oder[^a-z]auf ein Zeichen außerhalb.*.py[cod]erfasst.pyc,.pyound.pydauf einmal. Auch Klammerausdrücke passen nicht auf/.- POSIX-Zeichenklassen wie
[[:digit:]]sind ebenfalls möglich.
Der doppelte Stern **
** hat nur in Verbindung mit einem Schrägstrich eine besondere Bedeutung.
| Form | Bedeutung | Beispiele |
|---|---|---|
**/foo | foo in jeder Tiefe | foo, a/foo, a/b/foo |
**/logs/debug.log | logs/debug.log in jeder Tiefe | logs/debug.log, app/logs/debug.log |
abc/** | alles innerhalb von abc | abc/x, abc/x/y (nicht aber abc selbst) |
a/**/b | null oder mehr Verzeichnisse dazwischen | a/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
| Pfad | Ergebnis | Entscheidende Regel |
|---|---|---|
build/app.js | ignoriert | /build/ |
src/build/app.js | verfolgt | keine |
logs/server.log | ignoriert | *.log |
logs/important.log | verfolgt | !important.log |
docs/api/v1.pdf | ignoriert | docs/**/*.pdf |
#scratch.md | ignoriert | \#scratch.md |
Diese Tabelle lässt sich genau reproduzieren, indem Sie Regeln und Pfade in den Tab Mustertest des Generators einfügen.
Quellen
- Offizielle gitignore-Dokumentation (git-scm.com)
- GitHub Docs: Ignoring files
- Stand der Prüfung: 2026-09-23 (Beispiele mit git 2.50.1 verifiziert)