web-dev-qa-db-fra.com

Ignorer correctement tous les fichiers de manière récursive dans un dossier spécifique, à l'exception d'un type de fichier spécifique

J'ai vu des questions similaires ( 1 , 2 et ), mais je n'obtiens pas de solution adéquate.

Je dois ignorer tous les fichiers d'un dossier particulier, à l'exception d'un type de fichier spécifique. Le dossier est un sous-répertoire pour le chemin racine. Laissez-moi nommer le dossier Resources. Puisque je ne veux pas compliquer les choses, laissez-moi ignorer les fichiers de tous les dossiers nommés Resources où qu'ils se trouvent.

C'est la solution la plus courante (dans toutes les questions en double)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Le problème avec cette solution est que il arrête de suivre les fichiers récemment ajoutés (depuis * ignore tous les fichiers). Je ne veux pas continuer à exclure chaque type de fichier. Je veux un comportement normal où si un nouveau fichier est ajouté, git status le montre.

J'ai finalement eu une solution ici . La solution consiste à ajouter un autre .gitignore fichier dans le dossier Resources. Cela fonctionne correctement.

Puis-je obtenir le même résultat avec un seul fichier ignoré? Je trouve avoir beaucoup de fichiers ignorés dans différents répertoires un peu maladroit.

C'est ce que j'essaie de réaliser:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Mais cela donne la sortie opposée. Il ignore *.foo tape et suit d’autres fichiers.

77
nawfal

@ SimonBuchan est correct.

Depuis Git 1.8.2, Resources/** !Resources/**/*.foo travaux.

96
Jim G.

La meilleure solution consiste à ajouter un fichier Resources/.gitignore sous Resources contenant:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Si vous ne souhaitez ou ne pouvez pas ajouter ce fichier .gitignore, il existe une solution inélégante:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Vous devrez modifier ce modèle si vous ajoutez des répertoires plus profonds que ceux spécifiés.

24
Ben Martin

Cela peut paraître stupide, mais vérifiez si vous n'avez pas déjà ajouté le dossier/les fichiers que vous essayez d'ignorer auparavant à l'index. Si vous l'avez fait, peu importe ce que vous avez mis dans votre fichier .gitignore, les dossiers/fichiers seront toujours mis en scène.

4
Tiago

Je le fais mal ou la réponse acceptée ne fonctionne plus avec le git actuel.

J'ai effectivement trouvé la solution appropriée et l'ai postée sous presque la même question ici . Pour plus de détails, allez là-bas.

Solution:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/Resources/**/
# And except for *.foo files
!*.foo