2010-11-26 10 views
3

Ich benutze leere .hg_keep Dateien, um einige (sonst leere) Ordner in Mercurial zu behalten.Regex für alle Dateien außer .hg_keep

Das Problem ist, dass ich eine funktionierende Regex nicht finden kann, die alles außer den .hg_keep Dateien ausschließt.

können sagen, wir haben diese Dateistruktur:

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 

und ich möchte nur die .hg_keep Dateien unter a/b/ halten.

mit Hilfe von http://gskinner.com/RegExr/ habe ich folgende .hgignore:

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

aber Mercurial ignoriert alle .hg_keep Dateien in Unterordner von 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 

Ich weiß, dass ich eine Dose hd add all .hg_keep Dateien, aber gibt es eine Lösung mit einem regulären Ausdruck (oder glob)?

Antwort

1

Nicht ganz sicher, in welchem ​​Zusammenhang Sie die Regex verwenden, aber dies sollte es sein, diese Spiele alle Leitungen in .hg_keep endet:

^.*\.hg_keep$ 

EDIT: Und hier ist ein Regex Artikel passen nicht passend der obige Ausdruck:

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

Das sind die einzigen Zeilen, die er nicht übereinstimmen muss - ist dies für die .hgignore Datei. – robert

+0

@robert Danke, aktualisiert, um nicht passende Regex zu enthalten. –

+0

Funktioniert in http://gskinner.com/RegExr/ aber nicht in .hgignore. Vielleicht ein Problem mit dem Regex-Parsing in mercurial? Es passt auch die Dateien "a/file1" und "a/file2", die ich behalten möchte. – rmweiss

0

Versuchen Sie (?!.*/\.hg_keep$).

+0

Funktioniert nicht. Mit diesem in .hgignore ignoriert es alle Dateien. Bitte denken Sie daran, dass ich "a/file1" und "a/file2" behalten möchte. – rmweiss

3

Regexp Negation könnte dafür arbeiten. Wenn Sie alles außer die a/b/.hg_keep Datei ignorieren möchten, können Sie wahrscheinlich verwenden:

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

Die Teile dieses regexp, die wichtig sind:

^     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 

Der reguläre Ausdruck

^a/b/\.hg_keep$ 

würde nur die Datei a/b/.hg_keep entsprechen.

Seine Negation

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

wird alles andere passen.

0

Suchen Sie nach etwas Ähnliches. Eine Antwort gefunden, aber es ist nicht das, was wir hören wollen.

  1. Einschränkungen

Es gibt keine einfache Möglichkeit, alle aber eine Reihe von Dateien zu ignorieren.Der Versuch, eine invertierte Regex-Übereinstimmung zu verwenden, schlägt in Kombination mit anderen Mustern fehl. Dies ist eine absichtliche Einschränkung, da alternative Formate alle als zu wahrscheinlich angesehen wurden, um Benutzer zu verwirren, die die zusätzliche Flexibilität wert sind.

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

Verwandte Themen