120 votes

Différence entre les règles .gitignore avec et sans slash de fin comme /dir et /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/*

130voto

Victor Schröder Points 548

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

  • Avec /dir y /dir/ Git ne regardera même pas dans le répertoire donc le .gitkeep ne sera pas vu.
  • Avec /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.

34voto

CodeGnome Points 25402

Les motifs ont des significations différentes

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.

7voto

VonC Points 414372

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 pas a/doc/frotz répertoire ;
    cependant frotz/ correspond à frotz y a/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 section FNM_PATHNAME pour une description plus détaillée.

Prograide.com

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.

Powered by:

X