Pourquoi ! ne conserve-t-il pas un fichier dans un dossier ignoré ?

Une exception ne fonctionne pas tant que le dossier parent est exclu. Vérifiez sa règle avant d’ajouter des exceptions.

1. Comprendre le motif incorrect

Prenez build/keep.txt et build/discard.txt, non suivis à la racine. Ces règles excluent build lui-même : Git ne le parcourt pas pour chercher keep.txt. L’exception ultérieure ne peut pas réinclure ce fichier.

/build/
!/build/keep.txt

2. Ignorer le contenu, puis conserver un fichier

Remplacez les deux règles du .gitignore racine par celles ci-dessous. build reste accessible, son contenu direct est ignoré et keep.txt est réinclus. Pour une exception plus profonde, chaque dossier parent doit aussi rester accessible.

À priorité égale, la dernière règle correspondante l’emporte. Placez l’exception après l’exclusion et vérifiez aussi les autres règles et .gitignore imbriqués.

/build/*
!/build/keep.txt

3. Vérifier les deux fichiers

Créez les deux fichiers et lancez ces commandes à la racine. La sortie détaillée doit afficher !/build/keep.txt pour keep.txt et /build/* pour discard.txt. Une ligne avec ! indique une réinclusion, pas une exclusion.

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

L’état doit afficher build/keep.txt comme non suivi et omettre build/discard.txt. Pour des fichiers déjà suivis, consultez l’article dédié : les règles ne changent pas l’index.

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

Comment ignorer des fichiers déjà suivis par Git ?

Pour le comportement exact et davantage de détails, consultez les références officielles : Documentation Git · Documentation git check-ignore