gitignore: dir/ macht deine !-Ausnahmen wirkungslos
Ein ganzer Ordner ignoriert, die Ausnahme darin greift trotzdem nicht. Der Trick ist dir/* plus !dir/wichtiges/ statt dir/.
Ich wollte einen Cache-Ordner ignorieren, aber einen wertvollen Unterordner davon behalten. Die naheliegende .gitignore sah so aus, und funktionierte nicht:
.cache/
!.cache/wichtiges/
Der Unterordner blieb ignoriert, egal was ich probierte.
Warum
Wenn git ein Verzeichnis über dir/ komplett ausschließt, steigt es gar nicht erst in das Verzeichnis hinab. Es prüft die einzelnen Dateien darin nie, also bekommt die !-Ausnahme nie eine Chance zu greifen. Die Regel ist ausgehebelt, bevor sie gelesen wird.
Der Fix
Statt das Verzeichnis selbst zu ignorieren, ignoriere seinen Inhalt mit /*. Dann steigt git hinab, und die Ausnahme kann wirken:
.cache/*
!.cache/wichtiges/
Warum mich das überhaupt beschäftigt hat
Der Kontext war meine Regel, Wertvolles nie an regenerierbaren Orten liegen zu lassen. Manches landet doch in einem .cache-Ordner, ein manuell gezogener Token, ein einmaliger Export ohne Rückweg. Damit das den nächsten Aufräum-Lauf überlebt, muss die Ausnahme wirklich greifen. Genau da biss die dir/-Falle.