web-dev-qa-db-fra.com

Ne pas ignorer les sous-répertoires des répertoires ignorés dans Git

Disons que j'ai ignoré un répertoire, mais je veux y ignorer des sous-répertoires spécifiques. J'ai donc la configuration:

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

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

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

Mais cela ne fonctionne pas, et il n'y a pas non plus plusieurs permutations sur le même thème.

Celui qui fonctionne est

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

Mais cela semble un peu restrictif et verbeux?

78
Wil

Selon section format de modèle de la documentation de gitignore :

Un préfixe optionnel "!" ce qui annule le motif; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus. Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu. Git ne répertorie pas les répertoires exclus pour des raisons de performances, donc tous les modèles sur les fichiers contenus n'ont aucun effet, peu importe où ils sont définis. Mettez une barre oblique inverse ("\") devant le premier "!" pour les modèles 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/ le modèle doit être exclusivement annulé avant de supprimer 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/ ajoutez la troisième ligne:

!/uploads/rubbish/stuff/keep/**/*
100
Art Shayderov

Même si vous ajoutez quelque chose à .gitignore, vous pouvez forcer 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 le dossier vide, vous devriez donc ajouter un fichier "placeholder" -holder à la place, si le dossier est vide

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

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

**/build

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

Ensuite, vous ajoutez une autre ligne pour corriger le chemin que vous souhaitez inclure pour ressembler

!**/folder/build/* 

nous laissant un gitignore qui lit

**/build/* 
!**/folder/build/* 
5
John

Buo-Ren Lin et John les réponses sont assez utiles, mais je devais combiner les deux.

Lorsque je voulais 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 trouvé nécessaire de ré-inclure explicitement à la fois le sous-dossier et ses commentaires pour afficher les deux éléments dans le dossier et les sous-dossiers.

0
Josiah Yoder