Comment faire des fichiers .gitignore récursivement

106

J'essaie d'éviter le modèle suivant dans mon .gitignorefichier.

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Nous avons essayé:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

Cela n'a cependant pas fonctionné. C'est git sur Windows. Existe-t-il un moyen plus concis de faire cela sans répéter les choses?

orad
la source

Réponses:

116

Depuis git 1.8.2, ceci:

MyPrject/WebApp/Scripts/special/**/*.js

Devrait fonctionner selon cette réponse . Cela fonctionne également pour moi dans Windows 7 en utilisant Sourcetree 1.6.12.0 et la version de git qu'il installe (1.8.4-preview20130916).

Pour gitignore chaque fichier et dossier sous un répertoire de manière récursive:

MyPrject/WebApp/Scripts/special/**
Sam
la source
Et avant git 1.8?
ashes999
1
Si cette réponse ne fonctionne pas (sous Windows), ajoutez le caractère /au début. Exemple:/MyProject/WebApp/Scripts/special/**/*.js
batressc
3
Je suis gêné que ma réponse ne cesse de susciter des votes alors qu'elle est littéralement un lien vers une autre réponse.
Sam
1
@puk: le .gitignoredans cette question était dans la racine du dépôt (répertoire parent de /Webapp).
lucid_dreamer
1
Votre réponse semble bonne mais n'a pas fonctionné pour moi sur Windows 10 avec git 1.9.1 pour ignorer tous les fichiers sauf js dans le cas suivant: (première ligne) foo/bar/*/*(deuxième ligne) !foo/bar/**/*.jsCela n'a fonctionné que pour un niveau de sous-répertoires, mais pas de manière récursive.
LLL
19

Suite de la page de manuel de gitignore:

[...] git traite le motif comme un shell glob adapté à la consommation par fnmatch (3) avec le drapeau FNM_PATHNAME: les jokers dans le motif ne correspondront pas à un / dans le chemin.

Donc, cela signifie clairement qu'il n'y a aucun moyen de spécifier un certain nombre de répertoires entre deux chaînes, comme entre specialet js.

Néanmoins, vous pouvez avoir un .gitignorefichier par répertoire, donc peut-être dans votre cas le contenu suivant

*.js

à l'endroit suivant

MyPrject/WebApp/Scripts/special/.gitignore

serait suffisant?

Guillaume Lemaître
la source
J'avais l'habitude de l'avoir MyPrject/WebApp/Scripts/special*.jset cela correspondait MyPrject/WebApp/Scripts/specialfile.jsaussi bien MyPrject/WebApp/Scripts/special/a/b/c/file.js. Cependant, pour une raison quelconque, le comportement a changé et ma solution de contournement actuelle consiste à répertorier les répertoires individuellement. J'utilise GitHub pour Windows.
orad
1
par exemplefind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
9

Cela fonctionne pour moi sur osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
la source
0

Essayez d'exécuter git rm -r --cached MyPrject/WebApp/Scripts/special/ Votre répertoire mentionné a peut-être été mis en cache par git et apparaîtra sur les fichiers non suivis. Après avoir effacé le cache, assurez-vous de l'avoir mentionné .gitignore.

Pradipta Sarma
la source