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

89

J'ai vu des questions similaires ( 1 , 2 et 3 ), mais je n'obtiens pas de solution appropriée de leur part.

Je dois ignorer tous les fichiers dans un dossier particulier, à l'exception d'un type de fichier spécifique. Le dossier est un sous-répertoire du chemin racine. Permettez-moi de nommer le dossier Resources. Puisque je ne veux pas compliquer les choses, laissez-moi ignorer les fichiers sous tous les dossiers nommés Resourcesoù 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 qu'elle arrête le suivi des fichiers nouvellement ajoutés (puisqu'elle *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 montre.

J'ai enfin une solution ici . La solution est d'ajouter un autre .gitignorefichier dansResources dossier. Cela fonctionne correctement.

Puis-je réaliser la même chose avec un seul fichier ignoré? Je trouve que le fait d'avoir de nombreux fichiers ignorés dans différents répertoires est un peu maladroit.

C'est ce que j'essaye 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 le résultat opposé. Il ignore les *.footypes et suit les autres fichiers.

nawfal
la source

Réponses:

108

@SimonBuchan a raison.

Depuis git 1.8.2, Resources/** !Resources/**/*.foofonctionne.

Jim G.
la source
1
Cela fonctionne pour moi, léger ajustement, j'ai juste besoin de supprimer les répertoires et tout ce qui se trouve en dessous, donc je l'ai fait: DirectoryName1/** DirectoryName1/**/*pour chacun d'eux. Premièrement, supprimez les répertoires, mais vous avez besoin du second pour supprimer tous les types de fichiers.
Scala Enthusiast
27

La meilleure réponse est d'ajouter un fichier Resources / .gitignore sous Ressources contenant:

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

Si vous ne souhaitez pas 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 spécifié.

Ben Martin
la source
2
C'est triste .. En effet, j'aurai des répertoires plus profonds, donc je vais m'en tenir au premier :(
nawfal
Voir plus de détails sur la même solution ici: stackoverflow.com/questions/7803689/… - également lié ci-dessus par OP @nawfal
ici
7

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

Tiago
la source
5
Si quelqu'un rencontre ce cas d'utilisation spécifique, vous pouvez utiliser git rm --cached <path to files>pour effacer ces fichiers ignorés de git tout en les laissant dans le système de fichiers.
slothluvchunk
5

Soit je le fais mal, soit la réponse acceptée ne fonctionne plus avec le git actuel.

J'ai en fait trouvé la bonne solution et l'ai publiée sous presque la même question ici . Pour plus de détails, allez-y.

Solution:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Aleksander Stelmaczonek
la source
2
Oui, cela fonctionne pour moi. L'ajout de !/Resources/**/était crucial pour que git n'ignore pas les sous-répertoires.
Johnster le