Guide complet de la syntaxe des motifs .gitignore
Commentaires, échappements et espaces finaux, négation !, barre oblique finale, ancrage, jokers *, ? et [] et règles de ** expliqués avec des tableaux d'exemples.
Chaque ligne d'un .gitignore est un motif. La syntaxe ressemble aux globs du shell, mais son sens change beaucoup selon l'emplacement des barres obliques et l'emplacement de **. Le contenu ci-dessous s'appuie sur la documentation officielle de git, gitignore(5), et les exemples ont été vérifiés directement avec git 2.50.
Lignes vides, commentaires et échappements
- Une ligne vide ne correspond à rien. Utilisez-la comme séparateur pour la lisibilité.
- Une ligne qui commence par
#est un commentaire. Pour ignorer un fichier dont le nom commence par#, ajoutez une barre oblique inverse, comme\#. - Les espaces en fin de ligne sont ignorés. Si vous avez besoin d'un nom de fichier qui se termine par un espace, protégez l'espace avec une barre oblique inverse, comme
foo\. Les espaces en début de ligne restent dans le motif. - Une ligne qui commence par
!est un motif de négation. Pour un fichier dont le nom commence par!, écrivez\!important.txt.
Les espaces finaux sont invisibles et causent souvent des erreurs. Si une règle ne s'applique pas, activez l'affichage des espaces dans votre éditeur. Retenez aussi que seul le caractère espace est supprimé, pas les tabulations.
Barre oblique finale : uniquement les répertoires
Si un motif se termine par /, il ne correspond qu'aux répertoires. build/ ignore le répertoire build et tout son contenu, mais pas un fichier nommé build. À l'inverse, build sans barre correspond aux fichiers comme aux répertoires de ce nom.
Une barre oblique fixe la position
Si le reste du motif, hors barre finale, contient une / au début ou au milieu, le motif ne correspond qu'aux chemins relatifs au répertoire qui contient le .gitignore. On parle souvent d'ancrage. Sans /, git cherche les entrées de même nom à n'importe quelle profondeur sous le .gitignore.
| Motif | Correspond | Ne correspond pas |
|---|---|---|
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/ | répertoire doc/frotz/ | a/doc/frotz/ |
frotz/ | répertoires frotz/, a/frotz/ | fichier frotz |
La troisième ligne est la plus trompeuse. logs/debug.log contient une barre au milieu : il est donc ancré à la racine et équivaut à le préfixer par /. Pour attraper logs/debug.log à toute profondeur, utilisez **/logs/debug.log.
Jokers : *, ?, [ ]
*correspond à toute chaîne sauf/(chaîne vide comprise).*.logcorrespond àapp.loget àa/b/app.log, maislogs/*.logne correspond qu'àlogs/app.log, pas àlogs/2026/app.log.?correspond à un seul caractère sauf/.file?.txtcorrespond àfile1.txtmais pas àfile10.txt.[a-z]correspond à un caractère de l'intervalle, et[!a-z]ou[^a-z]à un caractère hors de l'intervalle.*.py[cod]attrape.pyc,.pyoet.pydd'un coup. Les crochets ne correspondent pas non plus à/.- Les classes de caractères POSIX comme
[[:digit:]]sont aussi utilisables.
Deux astérisques **
** n'a un sens particulier que lorsqu'il est collé à des barres obliques.
| Forme | Sens | Exemples |
|---|---|---|
**/foo | foo à toute profondeur | foo, a/foo, a/b/foo |
**/logs/debug.log | logs/debug.log à toute profondeur | logs/debug.log, app/logs/debug.log |
abc/** | tout le contenu de abc | abc/x, abc/x/y (mais pas abc lui-même) |
a/**/b | zéro répertoire ou plus entre les deux | a/b, a/x/b, a/x/y/b |
Ailleurs, par exemple le ** de foo** ou **bar, il se comporte comme un * ordinaire et ne franchit pas les barres. docs/**/*.pdf correspond à docs/manual.pdf comme à docs/a/b/manual.pdf, car /**/ correspond aussi à zéro répertoire.
Récapitulatif avec un petit exemple
# Sortie de build (seulement le répertoire build à la racine)
/build/
# Fichiers journaux à toute profondeur, sauf le journal important
*.log
!important.log
# Tous les PDF sous docs
docs/**/*.pdf
# Fichier dont le nom commence par #
\#scratch.md
| Chemin | Résultat | Règle décisive |
|---|---|---|
build/app.js | Ignoré | /build/ |
src/build/app.js | Suivi | Aucune |
logs/server.log | Ignoré | *.log |
logs/important.log | Suivi | !important.log |
docs/api/v1.pdf | Ignoré | docs/**/*.pdf |
#scratch.md | Ignoré | \#scratch.md |
Vous pouvez reproduire ce tableau à l'identique en collant les règles et les chemins dans l'onglet Test de motifs du générateur.
Références
- Documentation officielle de gitignore (git-scm.com)
- GitHub Docs : Ignoring files
- Vérifié le : 2026-09-23 (exemples contrôlés avec git 2.50.1)