154 votes

Désignations des sous-répertoires des répertoires ignorés dans Git

Supposons que j'ai ignoré un répertoire, mais que je veuille ignorer des sous-répertoires spécifiques qui s'y trouvent. J'ai donc la configuration suivante :

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

Et je veux ignorer tout sauf le KEEP_ME répertoire. J'espère que l'ignore ressemblera à quelque chose comme :

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

Mais cela ne fonctionne pas, pas plus que plusieurs permutations sur le même thème.

L'une d'entre elles, qui fonctionne, est la suivante

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

Mais cela semble un peu restrictif et verbeux ?

172voto

Art Shayderov Points 2140

Selon le section sur le format de motif de la documentation gitignore :

Un préfixe optionnel " !" qui annule le motif ; tout fichier correspondant est exclu par le préfixe. exclu par un motif précédent sera à nouveau inclus. I Il n'est pas possible de réintégrer un fichier si un répertoire parent de ce fichier est exclu. exclu. Git ne liste pas les répertoires exclus pour des raisons de donc les motifs sur les fichiers contenus n'ont aucun effet, peu importe où ils sont définis. où ils sont définis. Placez une barre oblique inverse ("\") devant le premier "pour les motifs qui commencent par un " !" littéral, par exemple, "!important !.txt".

Par conséquent, le répertoire parent précédemment exclu /uploads/rubbish/stuff/keep/ doit être annulé exclusivement avant d'annuler son contenu :

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

Pour inclure des sous-répertoires dans /uploads/rubbish/stuff/keep/ ajouter la troisième ligne :

!/uploads/rubbish/stuff/keep/**/*

46voto

KingCrunch Points 45168

Même si vous ajoutez quelque chose à .gitignore vous pouvez force git pour l'ajouter à l'index

git add --force uploads/rubbish/stuff/KEEP_ME/

Cependant, "KEEP_ME" semble être un répertoire et git n'aime généralement pas les répertoires vides, vous pouvez donc ajouter un fichier "placeholder" si le répertoire est vide.

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

17voto

user295691 Points 2156

La solution présentée comme la plus votée est incorrecte et facilement démontrable.

Commencez par ignorer tout ce qui se trouve dans uploads/* :

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

Maintenant, désignons le répertoire parent des éléments ignorés, comme indiqué ci-dessus :

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

Ne montre aucun fichier non suivi.

Pour que cela fonctionne, vous devez ignorer tous les fichiers qui se trouvent sous la rubrique uploads/ arbre ( uploads/**/* et pas seulement au plus haut niveau, uploads/* ) et ajoutez ensuite tous les répertoires parents de l'arbre que vous souhaitez conserver

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

Ce qui donne :

On branch master
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        uploads/rubbish/stuff/KEEP_ME/a

Si nous avions utilisé uploads/* dans le .gitignore ci-dessus, tous les fichiers intermédiaires auraient également été inclus. uploads/rubbish/a apparaîtrait dans la commande d'état ci-dessus.

9voto

Josiah Yoder Points 47

Buo-Ren Lin y Jean sont très utiles, mais j'ai eu besoin de combiner les deux.

Pour exclure d'autres sous-dossiers ainsi que des fichiers dans les téléchargements, j'ai trouvé nécessaire de spécifier explicitement des répertoires arbitraires avant le dossier donné à la fois en excluant le dossier et en incluant le sous-dossier

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

J'ai également jugé nécessaire de réintégrer explicitement le sous-dossier et son contenu afin d'afficher les éléments du dossier et des sous-dossiers.

6voto

John Points 61

J'essayais de comprendre comment inclure un dossier spécifique tout en excluant tous les dossiers avec l'exclusion générique.

**/build

si vous ajoutez le /* à la fin de votre exclusion générique, vous continuez à exclure tous les fichiers de construction. **/build/*

Ensuite, vous ajoutez une autre ligne pour corriger le chemin que vous voulez inclure et qui doit ressembler à ce qui suit

!**/folder/build/* 

en nous laissant un gitignore qui se lit comme suit

**/build/* 
!**/folder/build/*

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