J'essaie de résoudre un problème gitignore sur une grande structure de répertoires, mais pour simplifier ma question, je l'ai réduite à la suivante.
J'ai la structure de répertoires suivante de deux fichiers (foo, bar) dans un tout nouveau référentiel git (pas de validation jusqu'à présent):
a/b/c/foo
a/b/c/bar
De toute évidence, un 'git status -u' montre:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Ce que je veux faire, c'est créer un fichier .gitignore qui ignore tout ce qui se trouve dans a / b / c mais n'ignore pas le fichier «foo».
Si je crée un .gitignore ainsi:
c/
Ensuite, un 'git status -u' montre à la fois foo et bar comme ignorés:
# Untracked files:
...
# .gitignore
C'est ce que j'attends.
Maintenant, si j'ajoute une règle d'exclusion pour foo, donc:
c/
!foo
D'après la page de manuel 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
Cela 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 n'est pas non plus ignoré.
L'ordre des règles dans .gitignore ne semble pas non plus avoir d'importance.
Cela ne fait pas non plus ce à quoi je m'attendais:
a/b/c/
!a/b/c/foo
Celui-ci ignore à la fois foo et bar.
Une situation qui fonctionne est si je crée le fichier a / b / c / .gitignore et y mets:
*
!foo
Mais le problème avec ceci est qu'il y aura finalement d'autres sous-répertoires sous a / b / c et je ne veux pas avoir à mettre un .gitignore séparé dans chacun d'eux - j'espérais créer .gitignore `` basé sur un projet '' fichiers qui peuvent se trouver dans le répertoire supérieur de chaque projet et couvrir toute la structure de sous-répertoire «standard».
Cela semble également être équivalent:
a/b/c/*
!a/b/c/foo
C'est peut-être la chose la plus proche du "travail" que je puisse réaliser, 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 de nom "foo" à différents niveaux de l'arborescence des sous-répertoires.
Quoi qu'il en soit, soit je ne comprends pas très bien le fonctionnement des règles d'exclusion, soit elles ne fonctionnent pas du tout lorsque les répertoires (plutôt que les caractères génériques) sont ignorés - par une règle se terminant par /
Quelqu'un peut-il s'il vous plaît éclairer ce sujet?
Existe-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 un shell?
J'utilise et observe ceci avec git-1.6.6.1 sur Cygwin / bash3 et git-1.7.1 sur Ubuntu / bash3.