2009-10-02 10 views
42

Ich brauche eine .hgdontignore-Datei :-), um bestimmte Dateien einzuschließen und alles andere in einem Verzeichnis auszuschließen. Grundsätzlich möchte ich nur die .jar-Dateien in ein bestimmtes Verzeichnis und nichts anderes einschließen. Wie kann ich das machen? Ich bin nicht so geschickt in der Syntax für reguläre Ausdrücke. Oder kann ich das mit glob Syntax tun? (Ich bevorzuge das für die Lesbarkeit)hgignore: Hilfe Ignorieren aller Dateien, aber bestimmte

Als Beispiel Beispiel, sagen wir, ich möchte alle Dateien unter foo/bar/ mit Ausnahme von foo/bar/*.jar auszuschließen.

Antwort

36

Um dies zu tun, werden Sie diesen regulären Ausdruck verwenden müssen:

foo/bar/.+?\.(?!jar).+ 

Erklärung

Sie sagen es, was zu ignorieren, so dass dieser Ausdruck für Dinge suchen Sie don 't wollen.

  1. Sie suchen für jede Datei, dessen Namen (einschließlich relativem Verzeichnis) enthält (foo/bar /)
  2. Sie dann für beliebige Zeichen suchen, die eine Periode vorausgehen (. +? \. == Spiel einer oder mehr Zeichen von jeder Zeit, bis Sie die Periode Zeichen erreichen)
  3. Sie stellen Sie dann sicher, dass es nicht die "Jar" ​​endet (?! JAR) (Dies nennt man eine negative Vorschau
  4. Endlich greifen Sie das Ende es hat (. +)

Regelmäßige Express Ionen sind leicht zu vermasseln, also empfehle ich dringend, dass Sie ein Werkzeug wie Regex Buddy bekommen, um Ihnen zu helfen, sie zu bauen. Es wird eine Regex in einfaches Englisch zerlegen, was wirklich hilft.

EDIT

Hey Jason S, Sie haben mich erwischt, hat es diese Dateien verpassen.

Diese korrigierte regex wird für jedes Beispiel arbeiten Sie aufgelistet:

foo/bar/(?!.*\.jar$).+ 

Es findet:

  • foo/bar/baz.txt
  • foo/bar/baz
  • foo/bar/jar
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar.
  • foo/bar/baz.
  • foo/bar/baz.txt.

Aber nicht findet

  • foo/bar/baz.jar

Neue Erklärung

Diese Dateien suchen, sagt in „foo/bar /“, dann stimmen nicht überein, wenn es null oder mehr Zeichen von „.jar“ gefolgt und dann mehr Zeichen ohne ($ bedeutet Ende der Zeile), wenn das nicht der Fall ist, passen Sie die folgenden Zeichen an.

+0

whee! Danke, jetzt werde ich gehen und es versuchen. –

+1

hmm, gute Idee, aber es wird nicht wie gesagt funktionieren, da es keine Dateien ohne jegliche Erweiterung passt. Aber ich denke, ich kann es zu dem machen, was ich brauche. Der 'foo/bar /' Teil ist einfach, also vergessen wir das im Moment. Wenn Sie es reparieren können, so stimmt es mit den Dateien "baz.txt", "baz", "jar", "baz.jar.txt", "baz.jar", "baz." Und "baz.txt" überein. " aber nicht "baz.jar" dann werde ich akzeptieren. :-) –

+0

Hey Jason, ich verstehe was du meinst. Ich habe gerade meine Antwort mit einem funktionierenden Regex aktualisiert. Ich habe es gegen jede aufgelistete Saite getestet. –

41

Die Antwort von Michael ist ein strahlender, aber eine andere Möglichkeit ist, einfach auszuschließen:

foo/bar/** 

und dann manuell die .jar-Dateien hinzufügen. Sie können immer Dateien hinzufügen, die von einer Ignorierregel ausgeschlossen sind, und sie überschreibt die Ignorierung. Sie müssen nur daran denken, irgendwelche Gläser hinzuzufügen, die Sie in der Zukunft erstellen.

+0

Wie fügen Sie diese manuell hinzu? Das Hinzufügen von "hg add" schlägt fehl, da die Ignorierdatei verwendet wird. Das Hinzufügen von "hg add -I" schlägt fehl, da immer noch die Ignorierdatei gilt. Wie können sie hinzugefügt werden, um die Ignorierdatei zu überschreiben? – Mecki

+3

Mecki, fügt sie mit 'hg add' hinzu - es überschreibt die Ignorierung - vorausgesetzt, Sie verwenden keine Platzhalter in Ihrer Add-Zeile. Also setze foo/bar/** in dein .hgignore und tue dann 'hg add foo/bar/pfad/specific.file' und du kannst loslegen. Wenn Sie eine Menge Ausnahmen hinzufügen müssen, können Sie 'hg status -u -n foo/bar/lots - *. Jar' in 'xargs hg add' pipen und Ihre expliziten Overrides in großen Mengen ausführen. –

+1

und wenn jemand foo/bar/path/specific.file ändert, wird es trotzdem ignoriert? Es ist keine Lösung Mate – holms

Verwandte Themen