105 votes

Liste blanche et sous-répertoires dans Git

J'ai créé une liste blanche pour les fichiers texte uniquement.

*
!*.txt

Maintenant, j'ai un fichier texte non tracé dans un sous-répertoire - sub/dir/file.txt et il n'est PAS affiché (il est ignoré). Les fichiers texte dans le répertoire racine sont affichés, cependant.

Pourquoi cela, et comment y remédier ?

1 votes

0 votes

Les fichiers que vous voulez inclure se trouvent-ils dans un sous-répertoire ? Si c'est le cas, il se peut que ce sous-répertoire soit déjà ignoré par la première étoile de votre commande .gitignore .

0 votes

Oui. Ces fichiers seront aussi bas dans la structure du répertoire que le dossier 11.1.102.55 dans mon exemple. L'imbrication n'est pas toujours la même entre les dossiers/produits.

167voto

simont Points 11362

Si vous essayez de cette manière, vous échouerez, car vous finirez par mettre sur liste noire les répertoires de votre structure.

Pour résoudre ce problème, vous voulez mettre sur liste noire tout ce qui n'est pas un répertoire, et qui n'est pas un des types de fichiers que vous voulez engager, tout en ne mettant pas les répertoires sur liste noire .

Le site .gitignore qui fera cela :

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Testé dans une structure à trois niveaux sur liste blanche pour .txt en présence de *.one , *.two et *.three en utilisant un .gitignore situé dans le répertoire racine du référentiel - cela fonctionne pour moi. Vous n'aurez pas à ajouter .gitignore dans tous les répertoires de votre structure.

Les informations que j'ai utilisées pour trouver la réponse proviennent, entre autres, de.., ce (stackoverflow.com).

7voto

Sharadh Points 1218

Une façon plus simple d'y parvenir est la suivante :

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

Cela fonctionne parce que gitignore applique les motifs qui ne commencent pas par / à chaque niveau inférieur au .gitignore fichier :

S'il y a un séparateur au début ou au milieu (ou les deux) du motif, alors le motif est relatif au niveau du répertoire du fichier .gitignore particulier lui-même. Sinon, le motif peut également correspondre à n'importe quel niveau inférieur au niveau .gitignore.

Si vous vouliez faire cela pour des fichiers à l'intérieur d'un fichier répertoire les choses deviennent plus complexes :

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Cela fonctionne parce que gitignore a des règles spéciales pour ** :

Deux astérisques consécutifs (" ** ") dans les motifs comparés au nom de chemin complet peut avoir une signification particulière :

  • Une barre oblique suivie de deux astérisques consécutifs puis d'une barre oblique correspond à zéro ou plusieurs répertoires. Par exemple, " a/**/b " correspond " a/b ", " a/x/b ", " a/x/y/b " et ainsi de suite.

L'élément clé est de s'assurer que vous n'ignorez pas les répertoires, car alors tous les fichiers de ce répertoire sont ignorés sans tenir compte des autres règles.

1voto

Alex Points 335

J'ai cherché pendant longtemps :

  1. Supposons que j'ai une grande structure de dossiers avec ~100 000 répertoires imbriqués récursivement. Dans ces dossiers, il y a environ 30 000 fichiers de type .txt (dans mon cas : tapez *.md ). A côté de ces *.md il y a, disons, 500 Go de fichiers (un million et plus) que je ne veux pas suivre.

  2. Je veux que git suive seulement .txt (ou *.md ) dans tous les dossiers et sous-répertoires.

La réponse correcte devrait être : ce n'est pas possible dans Git.

Ce que j'ai fait à la place :

[edit : ne fonctionne pas non plus - J'ai essayé de créer un dossier avec des symlinks (ou hardlinks) et d'y utiliser git, mais git ne suit pas les symlinks et écrase les hardlinks. Doh !]

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