2010-02-11 7 views
10

Mit Mercurial muss ich alle Dateien außer denen in einem bestimmten Verzeichnis namens "Keepers" ignorieren.Mercurial .hgignore Negative Lookahead

Auf den ersten Blick schien dies einfach mit Regex und Negative Lookahead; Obwohl ich meine Regex in Regex Buddy und anderen Tools überprüfen kann, funktioniert TortoiseHg nicht wie erwartet.

Dateien:

  • junk \ junk.txt
  • Junk \ text
  • Wächter \ test \ test
  • Wächter \ test \ test2 \ hi.txt
  • keepersblah.txt

Nur die zwei Dateien unter Keeper sollten nicht ignoriert werden. Hier

ist die regex ich gehofft funktionieren würde:

^(?!keepers/).+$ 

Leider bewirkt dies, dass alle Dateien ignoriert werden. Wenn ich es ändere:

^(?!keepers).+$ 

es funktioniert wie Sie erwarten würden. Das heißt, es ignoriert alle Dateien/Ordner, die nicht mit Keepern beginnen. Aber ich möchte Dateien ignorieren, die mit Keepern beginnen.

Seltsamer, wenn ich es so weit ändern:

^(?!keepers/).+\..+$ 

Es wird richtig den Ordner übereinstimmen, aber es wird keine Dateien ignorieren, die nicht in den Pflegern Ordner sind, wenn sie nicht über eine Erweiterung verfügen.

Jeder Rat würde geschätzt werden.

Entfernen abgestorbener Images Link

Antwort

7

Das Problem mit dem ersten Ausdruck ist, dass die Regex auch gegen „Halter“ selbst getestet wird. Dieser Fall kann mit einer zusätzlichen Bedingung hinzugefügt:

^(?!keepers(?:/|$)) 

oder (weniger kompakt, aber einfacher zu verstehen):

^(?!keepers/|keepers$) 
+0

ich auch '^ (?! Bewahrer \ b) versucht,', aber das gescheitert gegen "keepers.txt" – eswald

+0

Brilliant! Vielen Dank, beide haben perfekt funktioniert. Ich habe mir eine Stunde lang den Kopf gestoßen :) –

+2

In einer Look-Ahead Assertion gibt es keine Notwendigkeit für nicht-einfangende Gruppen, da sie sowieso nicht erfasst wird: '^ (?! keepers (/ | $)). *' – Tomalak