guide

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

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.

MotifCorrespondNe correspond pas
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/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 : *, ?, [ ]

Deux astérisques **

** n'a un sens particulier que lorsqu'il est collé à des barres obliques.

FormeSensExemples
**/foofoo à toute profondeurfoo, a/foo, a/b/foo
**/logs/debug.loglogs/debug.log à toute profondeurlogs/debug.log, app/logs/debug.log
abc/**tout le contenu de abcabc/x, abc/x/y (mais pas abc lui-même)
a/**/bzéro répertoire ou plus entre les deuxa/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
CheminRésultatRègle décisive
build/app.jsIgnoré/build/
src/build/app.jsSuiviAucune
logs/server.logIgnoré*.log
logs/important.logSuivi!important.log
docs/api/v1.pdfIgnorédocs/**/*.pdf
#scratch.mdIgnoré\#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

← PrécédentQuoi ignorer et quoi commiter