Y a-t-il une différence entre /dir
y /dir/
dans le fichier .gitignore d'un dépôt Git ?
En quoi les éléments suivants sont-ils différents ?
/dir
/dir/
/dir/*
Y a-t-il une différence entre /dir
y /dir/
dans le fichier .gitignore d'un dépôt Git ?
En quoi les éléments suivants sont-ils différents ?
/dir
/dir/
/dir/*
Il s'agit d'une vieille question, mais elle est très bien classée sur Google et la réponse la plus votée est la suivante mauvais . Voici la bonne réponse.
Oui, ces règles sont différentes.
/dir
correspondra à un fichier, un répertoire, un lien, tout ce qui est nommé dir
/dir/
correspondra à seulement un répertoire nommé dir
/dir/*
correspondra à tous les fichiers, répertoires et tout ce qui se trouve à l'intérieur de un répertoire nommé dir
(mais pas le dir
lui-même)./dir
, /dir/
y /dir/*
son PAS équivalent. La différence est très nette lorsque l'on utilise des règles dérogatoires, comme la fameuse !.gitkeep
pour contourner la limitation du suivi des répertoires vides. Supposons que l'existence du fichier dir/.gitkeep
/dir
y /dir/
Git ne regardera même pas dans le répertoire donc le .gitkeep
ne sera pas vu./dir/*
le fichier sera détecté par Git et le répertoire sera conservé si ce .gitkeep
est commis, car la règle ne s'applique pas au répertoire lui-même, seulement à son contenu.OBSERVATION : Toutes les règles mentionnées ci-dessus sont ancrées au répertoire courant (l'endroit où le .gitignore
est), en raison de la /
préfixe. Sans le préfixe, les règles s'appliqueraient non seulement pour ce répertoire spécifique, mais aussi pour les sous-répertoires ou partout dans le référentiel, si le .gitignore
est situé au niveau de la racine.
Selon la section Format du modèle de gitignore(5) :
Si le motif se termine par une barre oblique, celle-ci est supprimée pour les besoins de la description suivante, mais elle ne trouvera une correspondance qu'avec un répertoire. En d'autres termes, foo/ correspondra à un répertoire foo et aux chemins situés en dessous, mais ne correspondra pas à un fichier régulier ou à un lien symbolique foo (ceci est cohérent avec la façon dont pathspec fonctionne en général dans git).
Si le motif ne contient pas de barre oblique /, git le traite comme un motif shell glob et vérifie s'il correspond au chemin d'accès relatif à l'emplacement du fichier .gitignore (relatif au premier niveau de l'arbre de travail s'il ne s'agit pas d'un fichier .gitignore).
Cela signifie que "dir" peut être un fichier, un répertoire ou un lien symbolique, mais que "dir/" avec un slash de fin ne correspondra qu'à un répertoire. Dans la plupart des cas, la différence n'a pas d'importance, mais lorsqu'elle en a, comprendre la distinction peut lever l'ambiguïté de vos fichiers .gitignore.
Git 2.23 (Q3 2019) tente de réorganiser la description des barres obliques dans les motifs de gitignore (utilisées pour indiquer des choses comme " ancré à ce niveau seulement " et " ne correspond qu'aux répertoires "). correspond aux répertoires")
La documentation comprend maintenant :
La barre oblique '
/
' est utilisé comme séparateur de répertoire.
Les séparateurs peuvent se trouver au début, au milieu ou à la fin de l'article..gitignore
modèle de recherche.S'il y a un séparateur au début ou au milieu (ou les deux) du modèle, alors le modèle est relatif au niveau du répertoire de l'utilisateur particulier.
.gitignore
lui-même.
Sinon, le motif peut également correspondre à n'importe quel niveau inférieur à l'élément.gitignore
niveau.S'il y a un séparateur à la fin du motif, le motif ne correspondra qu'aux répertoires, sinon le motif peut correspondre à la fois aux fichiers et aux répertoires.
Par exemple, un modèle
doc/frotz/
correspond àdoc/frotz
mais pasa/doc/frotz
répertoire ;
cependantfrotz/
correspond àfrotz
ya/frotz
qui est un répertoire (tous les chemins sont relatifs à partir de l'icône.gitignore
).Un astérisque "
*
" correspond à tout sauf à une barre oblique.
Le caractère "?
" correspond à n'importe quel caractère sauf "/
".
La notation de l'intervalle, par exemple[a-zA-Z]
peut être utilisé pour faire correspondre l'un des caractères d'une plage.
Voir fnmatch(3) et la sectionFNM_PATHNAME
pour une description plus détaillée.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.