2010-11-26 34 views
3

J'utilise des fichiers vides .hg_keep pour conserver certains dossiers (sinon vides) dans Mercurial.Regex pour tous les fichiers sauf .hg_keep

Le problème est que je ne peux pas trouver une regex de travail qui exclut tout sauf les fichiers .hg_keep.

permet de dire que nous avons cette filestructure:

a/b/c2/.hg_keep 
a/b/c/d/.hg_keep 
a/b/c/d/file1 
a/b/c/d2/.hg_keep 
a/b/.hg_keep 
a/b/file2 
a/b/file1 
a/.hg_keep 
a/file2 
a/file1 

et je veux garder que les .hg_keep fichiers sous a/b/.

avec l'aide de http://gskinner.com/RegExr/ j'ai créé les éléments suivants .hgignore:

syntax: regexp 
.*b.*/(?!.*\.hg_keep) 

mais Mercurial ne tient pas compte tous .hg_keep fichiers dans des sous-dossiers de b.

# hg status 
? .hgignore 
? a/.hg_keep 
? a/b/.hg_keep 
? a/file1 
? a/file 

# hg status -i 
I a/b/c/d/.hg_keep 
I a/b/c/d/file1 
I a/b/c/d2/.hg_keep 
I a/b/c2/.hg_keep 
I a/b/file1 
I a/b/file2 

Je sais que je Apeut hd add tous les fichiers .hg_keep, mais est-il une solution avec une expression régulière (ou glob)?

Répondre

1

Pas tout à fait sûr dans quel contexte vous utilisez l'expression régulière mais cela ne devrait l'être, cela correspond à toutes les lignes se terminant par .hg_keep:

^.*\.hg_keep$ 

EDIT: Et voici une expression rationnelle pour correspondre à des éléments qui ne correspondent pas l'expression ci-dessus:

^(?:(?!.*\.hg_keep).)*$ 
+0

Ce sont les seules lignes dont il a besoin pour correspondre pas - c'est le fichier .hgignore. – robert

+0

@robert Merci, mis à jour pour inclure une expression rationnelle non correspondante. –

+0

Fonctionne dans http://gskinner.com/RegExr/ mais pas dans .hgignore. Peut-être un problème avec l'analyse syntaxique dans mercurial? Il correspond également aux fichiers "a/file1" et "a/file2" que je veux conserver. – rmweiss

0

Essayez (?!.*/\.hg_keep$).

+0

Ne fonctionne pas. Avec ceci dans .hgignore, il ignore tous les fichiers. Rappelez-vous que je veux garder "a/file1" et "a/file2". – rmweiss

3

La négation Regexp peut fonctionner pour cela. Si vous voulez ignorer tout sauf le fichier a/b/.hg_keep, vous pouvez probablement utiliser:

^(?!a/b/\.hg_keep)$ 

Les parties de ce regexp qui comptent sont les suivants:

^     anchor the match to the beginning of the file path 
(?! ...)   negation of the expression between '!' and ')' 
a/b/\.hg_keep  the full path of the file you want to match 
$     anchor the match to the end of the file path 

L'expression régulière

^a/b/\.hg_keep$ 

correspondrait seulement le fichier appelé a/b/.hg_keep.

Sa négation

^(?!a/b/\.hg_keep)$ 

correspondront tout le reste.

0

Vous cherchez quelque chose de similaire à cela. J'ai trouvé une réponse, mais ce n'est pas ce que nous voulons entendre.

  1. Limites

Il n'y a aucun moyen simple d'ignorer tous, mais un ensemble de fichiers.Tenter d'utiliser une correspondance regex inversée échouera lorsqu'elle sera combinée à d'autres modèles. Il s'agit d'une limitation intentionnelle, car tous les formats alternatifs étaient considérés comme trop susceptibles de confondre les utilisateurs pour justifier la flexibilité supplémentaire.

Ref: https://www.mercurial-scm.org/wiki/.hgignore