J'essaie de résoudre un problème de gitignore sur une grande structure de répertoires, mais pour simplifier ma question, je l'ai réduite à ce qui suit.
J'ai la structure de répertoire suivante de deux fichiers (foo, bar) dans un tout nouveau dépôt git (pas de commits jusqu'à présent) :
a/b/c/foo
a/b/c/bar
Évidemment, un "git status -u" montre :
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Ce que je veux faire est de créer un fichier .gitignore qui ignore tout ce qui se trouve à l'intérieur de a/b/c mais qui n'ignore pas le fichier 'foo'.
Si je crée un .gitignore ainsi :
c/
Puis un 'git status -u' montre que foo et bar sont ignorés :
# Untracked files:
...
# .gitignore
C'est ce à quoi je m'attendais.
Maintenant si j'ajoute une règle d'exclusion pour foo, donc :
c/
!foo
Selon la page de manuel de gitignore, je m'attendrais à ce que cela fonctionne. Mais ce n'est pas le cas - il ignore toujours foo :
# Untracked files:
...
# .gitignore
Cela ne fonctionne pas non plus :
c/
!a/b/c/foo
Ceci non plus :
c/*
!foo
Donne :
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
Dans ce cas, bien que foo ne soit plus ignoré, bar ne l'est pas non plus.
L'ordre des règles dans .gitignore ne semble pas non plus avoir d'importance.
Cela ne fait pas non plus ce que j'attendais :
a/b/c/
!a/b/c/foo
Celui-là ignore à la fois foo et bar.
Une situation qui fonctionne est celle où je crée le fichier a/b/c/.gitignore et où je le mets dedans :
*
!foo
Mais le problème avec ceci est qu'il y aura éventuellement d'autres sous-répertoires sous a/b/c et je ne veux pas avoir à mettre un .gitignore séparé dans chacun d'entre eux - j'espérais créer des fichiers .gitignore 'basés sur le projet' qui pourraient se trouver dans le répertoire supérieur de chaque projet, et couvrir toute la structure 'standard' des sous-répertoires.
Cela semble également être équivalent :
a/b/c/*
!a/b/c/foo
C'est peut-être ce qui se rapproche le plus d'un "fonctionnement", mais les chemins relatifs complets et les exceptions explicites doivent être indiqués, ce qui va être pénible si j'ai beaucoup de fichiers du nom "foo" à différents niveaux de l'arborescence des sous-répertoires.
Quoi qu'il en soit, soit je ne comprends pas bien le fonctionnement des règles d'exclusion, soit elles ne fonctionnent pas du tout lorsque des répertoires (plutôt que des caractères génériques) sont ignorés - par une règle se terminant par un /
Quelqu'un peut-il m'éclairer à ce sujet ?
Y a-t-il un moyen de faire en sorte que gitignore utilise quelque chose de sensé comme des expressions régulières au lieu de cette syntaxe maladroite basée sur le shell ?
J'utilise et observe ceci avec git-1.6.6.1 sur Cygwin/bash3 et git-1.7.1 sur Ubuntu/bash3.
0 votes
Question connexe : stackoverflow.com/questions/2820255/
5 votes
Question très bien rédigée ! La quantité de cas que vous avez essayés m'a vraiment aidé à comprendre ce que je faisais mal dans mon cas similaire. Dieu merci, j'ai cherché pendant longtemps aujourd'hui.