Warum bleibt eine Datei trotz ! in einem ignorierten Verzeichnis ausgeschlossen?

Eine Ausnahme für eine Datei greift nicht, solange ihr Elternverzeichnis ausgeschlossen ist. Prüfen Sie zuerst die Verzeichnisregel, bevor Sie weitere Ausnahmen ergänzen.

1. Die fehlerhafte Regel erkennen

Angenommen, im Projekt liegen die unversionierten Dateien build/keep.txt und build/discard.txt. Die folgenden Regeln schließen build selbst aus. Git durchsucht das Verzeichnis daher nicht nach keep.txt. Die spätere Ausnahme kann diese Datei nicht wieder einschließen.

/build/
!/build/keep.txt

2. Den Inhalt ausschließen und eine Datei zulassen

Ersetzen Sie die vorherigen zwei Regeln in der .gitignore im Projektstamm durch diese Regeln. Git kann build weiterhin durchsuchen, schließt dessen direkten Inhalt aus und lässt keep.txt wieder zu. Das Beispiel gilt für eine Datei direkt in build. Bei tieferen Pfaden müssen alle Elternverzeichnisse durchsuchbar bleiben.

Bei gleicher Priorität entscheidet die letzte passende Regel. Setzen Sie die Ausnahme daher hinter die Ausschlussregel. Prüfen Sie auch weitere passende Regeln und .gitignore-Dateien in Unterverzeichnissen.

/build/*
!/build/keep.txt

3. Beide Dateien prüfen

Erstellen Sie die beiden Beispieldateien und führen Sie diese Befehle im Projektstamm aus. Die ausführliche Ausgabe sollte für keep.txt die Regel !/build/keep.txt und für discard.txt die Regel /build/* zeigen. Eine passende !-Regel bedeutet, dass die Datei wieder eingeschlossen wird, nicht dass sie ignoriert bleibt.

git check-ignore -v -- build/keep.txt build/discard.txt

Die Statusausgabe sollte build/keep.txt als unversioniert anzeigen und build/discard.txt auslassen. Werden die Dateien bereits versioniert, lesen Sie den entsprechenden Artikel. Ausschlussregeln ändern keine bestehenden Indexeinträge.

git status --short --untracked-files=all -- build/

Wie ignoriere ich Dateien, die Git bereits versioniert?

Das genaue Verhalten und weitere Einzelheiten erläutern die offiziellen Quellen: Git-Dokumentation · Dokumentation zu git check-ignore