Sprache:Deutsch
DEV-TOOL

Gitignore Debugger

Finde genau heraus, warum Git deine Datei nicht ignoriert.

Füge einen Dateipfad und deine .gitignore-Regeln ein. Wir zeigen dir, welche Regel greift — und warum.

Alles läuft in deinem Browser. Deine Dateien werden nie übertragen.

Was ist eine .gitignore-Datei?

Eine .gitignore-Datei ist eine Textdatei, die Git mitteilt, welche Dateien aus der Versionskontrolle herausbleiben sollen. Jede Zeile ist ein Muster — *.log, node_modules/, .env — und jeder unversionierte Pfad, der auf ein Muster passt, verschwindet aus git status, wird von git add . übersprungen und niemals committet.

Das Wort unversioniert trägt fast die ganze Bedeutung dieses Satzes, und es erklärt allein mehr Fälle von „gitignore funktioniert nicht“ als alle Musterfehler zusammen. Git schaut nur für Dateien in die .gitignore, die es nicht schon verfolgt. Sobald eine Datei einmal committet wurde, verfolgt Git sie auf Dauer weiter — ganz egal, was du danach in die .gitignore schreibst.

Was der Gitignore Debugger macht

Füge einen Dateipfad und den Inhalt deiner .gitignore ein: Dieser .gitignore-Debugger liefert dasselbe Urteil wie Git — ignoriert oder nicht ignoriert — zusammen mit der genauen Regel und Zeilennummer, die dafür verantwortlich sind. Danach listet er alle Regeln auf, die auf den Pfad passen, in der Reihenfolge, in der Git sie auswertet, und markiert die, die tatsächlich entschieden hat.

Genau dieser letzte Teil fehlt bei einem einfachen Gitignore-Checker. Dass eine Datei ignoriert wird, ist selten das Schwierige. Zu wissen, welche deiner vierzig Regeln das getan hat — und warum die erwartete verloren hat — schon. Das gilt in beide Richtungen: warum Git deine Datei ignoriert, obwohl du sie committen willst, und warum es die nicht ignoriert, die du loswerden willst.

Die Engine setzt Gits Musterregeln neu um: Muster auf Basisnamen gegenüber verankerten Mustern, *, das nie über ein / hinausgeht, die drei Formen von **, die /-Suffixe nur für Verzeichnisse, Zeichenklassen, escapte Leerzeichen am Zeilenende. Ihr Verhalten ist gegen die echte Ausgabe von git check-ignore geprüft, nicht bloß angenommen.

So benutzt du ihn

  1. Gib den Pfad so ein, wie er in deinem Repository steht, relativ zur Wurzel — src/config/local.json, nicht C:\projects\app\src\config\local.json. Verwende Schrägstriche; Windows-Backslashes werden für dich umgewandelt.
  2. Füge deine komplette .gitignore ein. Kürze sie nicht auf die eine Regel, die du in Verdacht hast — meistens ist die Rangfolge zwischen den Regeln der eigentliche Fehler, und beim Kürzen wirfst du genau diese Information weg.
  3. Lies das Urteil und danach die Regelkette darunter. Dort hört eine Gitignore-Regel, die nicht funktioniert, auf, ein Rätsel zu sein.

Um Gitignore-Regeln gegen ein Verzeichnis statt gegen eine Datei zu testen, beende den Pfad mit einem Schrägstrich — build/. Der Unterschied ist wichtig, denn eine Regel, die auf / endet, passt nur auf Verzeichnisse.

Warum Gitignore-Regeln manchmal nicht funktionieren

Die Übeltäter, ungefähr nach Häufigkeit sortiert:

Rangfolge der Gitignore-Regeln: die letzte Übereinstimmung gewinnt

Das ist die Sache, über die alle stolpern. Innerhalb einer .gitignore entscheidet das letzte Muster, das auf einen Pfad passt, über sein Schicksal — nicht das erste. Diese beiden Dateien enthalten identische Regeln und liefern für important.log entgegengesetzte Ergebnisse:

*.log
!important.log        → important.log wird committet
!important.log
*.log                 → important.log wird ignoriert

Setze also breite Regeln zuerst und Ausnahmen danach. Über Dateien hinweg gewinnt eine .gitignore in einem Unterverzeichnis gegen eine weiter oben, und zwar für die Pfade darunter. Git liest außerdem .git/info/exclude, das nur zum Repository gehört und nie committet wird, sowie deine globale core.excludesFile. Eine Regel, die du in keiner .gitignore findest, versteckt sich oft an einer dieser beiden Stellen — git check-ignore -v zeigt die Datei und die Zeile, die entschieden haben.

Negationsregeln, und warum ! so oft scheitert

Ein ! vor einem Muster nimmt etwas wieder auf, das eine frühere Regel ignoriert hat. Das hat zwei Grenzen, und die zweite erklärt so gut wie jeden Fall von „die Gitignore-Negation funktioniert nicht“.

Erstens muss vorher irgendetwas den Pfad ignoriert haben. !important.log allein bewirkt nichts, weil es nie etwas zu überschreiben gab.

Zweitens, und weit überraschender: Du kannst eine Datei in einem ignorierten Verzeichnis nicht wieder aufnehmen. Das hier funktioniert nicht, und kein Umsortieren hilft:

build/
!build/keep.txt

Wenn build/ ignoriert ist, steigt Git nie hinein. Es sieht sich build/keep.txt nicht an und kommt deshalb nie bei Zeile 2 an. Ignoriere stattdessen den Inhalt des Verzeichnisses — dann bleibt das Verzeichnis selbst durchlaufbar:

build/*
!build/keep.txt

Um etwas Tieferes zu retten, muss auch jedes Zwischenverzeichnis erreichbar bleiben — build/*, dann !build/assets/, dann !build/assets/logo.svg.

Ignorierte übergeordnete Verzeichnisse

Gits Verzeichnisdurchlauf stoppt beim ersten ignorierten Verzeichnis, auf das er trifft, und alles darunter erbt das Urteil, ohne geprüft zu werden. Darum gewinnt ein ignoriertes übergeordnetes Verzeichnis gegen jede Regel, die du für die Datei selbst geschrieben hast, so genau sie auch aussieht.

In diesem Fall nennt der Debugger das übergeordnete Verzeichnis, das den Durchlauf blockiert hat, statt nur zu sagen, dass die Datei ignoriert wird — und er zeigt trotzdem die Negationsregeln, die du für die Datei geschrieben hast, markiert als unerreichbar, weil Git nie weit genug gekommen ist, um sie zu berücksichtigen. Korrigiere zuerst das Verzeichnis, dann funktionieren die Regeln darunter von selbst wieder.

Häufige .gitignore-Fehler

Ein paar Beispiele aus der Praxis

Der Pfad src/logs/debug.log ist gegen diese Regeln nicht ignoriert. Die Negation ist die letzte Übereinstimmung, und kein übergeordnetes Verzeichnis blockiert den Durchlauf — sie wird also erreicht und gewinnt:

*.log
!src/logs/debug.log

Der Pfad build/keep.txt ist gegen diese Regeln ignoriert, wegen build/ in Zeile 1, das auf das übergeordnete Verzeichnis passt. Zeile 2 greift nie:

build/
!build/keep.txt

Der Pfad docs/api/notes.md ist gegen diese Regel nicht ignoriert, weil das Muster durch seinen Schrägstrich verankert ist und * den in api/notes.md nicht überspringt. Gemeint war docs/**/*.md:

docs/*.md

Füge irgendeines dieser Beispiele oben in den Gitignore-Tester ein, um die vollständige Regelkette zu sehen. Zurück im Terminal ist git check-ignore -v path/to/file das eingebaute Gegenstück — es nennt Quelldatei, Zeilennummer und Muster, die entschieden haben, und das lohnt sich zu kennen.

Häufige Fragen

Warum ignoriert Git meine Datei?

Irgendein Muster passt darauf, und oft ist es nicht das, auf das du gerade schaust. Die üblichen Verdächtigen sind eine .gitignore in einem Unterverzeichnis, ein ignoriertes übergeordnetes Verzeichnis oder deine globale Exclude-Datei. Führe git check-ignore -v path/to/file aus: Es gibt genau die Quelldatei, die Zeilennummer und das Muster aus, die entschieden haben. Pfad und Regeln oben in den Debugger einzufügen zeigt dasselbe — plus die Regeln, die gepasst haben und verloren.

Warum funktioniert meine .gitignore-Regel nicht?

Vier Ursachen deckten fast alle Fälle ab, ungefähr nach Häufigkeit: Die Datei wird schon verfolgt, die Regel wird also vollständig übersprungen; eine spätere Regel hat sie überschrieben, weil die letzte Übereinstimmung gewinnt; ein übergeordnetes Verzeichnis ist ignoriert, Git hat die Regel also nie erreicht; oder das Muster ist anders verankert, als du dachtest — ein Schrägstrich an einer anderen Stelle als am Ende verankert ein Muster an das Verzeichnis, in dem die .gitignore liegt.

Warum nimmt ! meine Datei nicht wieder auf?

Entweder hat vorher nichts den Pfad ignoriert, dann hatte die Negation nichts zu überschreiben, oder — viel wahrscheinlicher — die Datei liegt in einem ignorierten Verzeichnis. Git steigt nicht in ignorierte Verzeichnisse hinein, sieht die Datei also nie und wertet deine !-Regel nie aus.

Ignoriere den Inhalt des Verzeichnisses statt das Verzeichnis selbst: Ersetze build/ durch build/*, lass !build/keep.txt danach stehen, und die Negation wird erreicht.

Gewinnt die letzte .gitignore-Regel?

Ja. Innerhalb einer Datei entscheidet das letzte Muster, das auf einen Pfad passt, über sein Schicksal — nicht das erste und nicht das spezifischste. *.log gefolgt von !important.log behält important.log; tausche die beiden Zeilen, und sie wird ignoriert. Setze breite Regeln zuerst und Ausnahmen danach.

Warum verhindert ein ignorierter Ordner, dass eine Negationsregel wirkt?

Weil Gits Verzeichnisdurchlauf beim ersten ignorierten Verzeichnis stoppt. Wenn build/ passt, markiert Git den ganzen Teilbaum als ignoriert, ohne aufzulisten, was darin liegt — !build/keep.txt wird also nicht überschrieben, es wird einfach nie erreicht. Umsortieren ändert daran nichts; etwas ändert nur, das Verzeichnis wieder durchlaufbar zu machen, und genau das tut build/*.

Wie teste ich eine .gitignore-Regel?

Füge den Dateipfad und deine Regeln oben auf dieser Seite in den Debugger ein. Er liefert das Urteil, die entscheidende Regel und Zeile und alle Regeln, die unterwegs gepasst haben — auch Negationen, die nie hätten wirken können.

In einem echten Repository nennt git check-ignore -v path/to/file die verantwortliche Quelldatei, Zeile und Muster, und git status --ignored listet alles auf, was gerade ignoriert wird.

Wirkt .gitignore auf bereits verfolgte Dateien?

Nein. .gitignore gilt nur für unversionierte Pfade. Sobald eine Datei einmal committet wurde, verfolgt Git sie weiter, und die Regel wird übersprungen — das ist der häufigste Grund, warum eine völlig korrekte Regel scheinbar nichts tut. Um eine Datei nicht mehr zu verfolgen, ohne sie zu löschen, führe git rm --cached path/to/file aus und committe diese Änderung.

Eine Stelle, die oft in die Irre führt: git check-ignore meldet auch für eine verfolgte Datei eine Übereinstimmung, weil es die Muster prüft, ohne den Index anzusehen. Ein „ja, ignoriert“ von diesem Befehl heißt nicht, dass Git die Datei nicht mehr verfolgt.

Dürfen .gitignore-Regeln Leerzeichen enthalten?

Ja, in der Mitte. my logs/ passt auf ein Verzeichnis mit einem Leerzeichen im Namen, ganz ohne Escaping. Leerzeichen am Ende sind eine andere Geschichte: Git schneidet sie ab, also verhält sich *.log mit einem Leerzeichen dahinter genau wie *.log. Um einen Dateinamen zu treffen, der wirklich auf ein Leerzeichen endet, escape es — foo\ .

Führende Leerzeichen sind dagegen bedeutsam und werden nie abgeschnitten: Eine versehentlich eingerückte Regel passt also nur auf Pfade, die mit diesem Leerzeichen beginnen. Wenn eine Regel grundlos wirkungslos scheint, prüfe sie auf überflüssige Einrückung.

Wo sucht Git außer in .gitignore nach Ausschlussregeln?

An drei weiteren Stellen, in dieser Rangfolge geprüft: die .gitignore-Dateien selbst, wobei das tiefste Verzeichnis gewinnt; dann .git/info/exclude, das nur zum Repository gehört und nie committet wird; dann das, worauf core.excludesFile zeigt, deine globale Ausschlussliste.

Eine Regel, die du nirgends im Repository findest, steckt also meist in einer der letzten beiden. git config --get core.excludesFile verrät den globalen Pfad, und git check-ignore -v nennt die Datei, die wirklich entschieden hat.

Was ist der Unterschied zwischen * und **?

* passt auf jede Zeichenfolge außer /, verlässt also nie ein einzelnes Pfadsegment. src/*/test.js geht genau eine Ebene tief.

** überspringt Trennzeichen, aber nur an den drei Stellen, die Git kennt — ein **/ am Anfang für beliebige Tiefe, ein /** am Ende für alles in einem Verzeichnis und /**/ in der Mitte für null oder mehr Verzeichnisse. Überall sonst, etwa in a**b, verhalten sich die zusätzlichen Sternchen wie ein einzelnes *.