2009-10-02 13 views
42

Potrzebuję pliku .hgdontignore :-), aby dołączyć pewne pliki i wykluczyć wszystko inne w katalogu. Zasadniczo chcę uwzględnić tylko pliki .jar w określonym katalogu i nic więcej. Jak mogę to zrobić? Nie jestem biegły w składni wyrażenia regularnego. Czy mogę to zrobić za pomocą składni globu? (Preferuję to dla czytelności)hgignore: pomoc ignorowanie wszystkich plików, ale niektóre z nich

Jako lokalizację przykładową, załóżmy, że chcę wykluczyć wszystkie pliki pod numerem foo/bar/ z wyjątkiem foo/bar/*.jar.

Odpowiedz

36

Aby to zrobić, trzeba użyć tego wyrażenia regularnego:

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

wyjaśnienia

Mówisz jej, co zignorować, więc to wyrażenie jest poszukiwanie rzeczy don "t chcesz.

  1. szukać dowolnego pliku, którego nazwa (w tym katalogu względnej) obejmuje (foo/bar /)
  2. wtedy szukać wszelkich znaków, które poprzedzają kropkę (. +? \. == mecz jeden lub więcej postacie o dowolnej porze, aż dojdziesz do postaci okresu)
  3. Następnie upewnij się, że nie ma zakończenia "jar" (?! jar) (To się nazywa negatywne spojrzenie z wyprzedzeniem
  4. W końcu chwytasz zakończenie ma (. +)

Ekspres zwykły jony są łatwe do zepsucia, więc zdecydowanie sugeruję, że otrzymasz narzędzie takie jak Regex Buddy, które pomoże Ci je zbudować. Spowoduje to rozbicie wyrażeń regularnych na zwykły angielski, co naprawdę pomaga.

EDIT

Hej Jason S, że mnie złapią, to nie przegap tych plików.

to poprawione regex będzie pracować dla każdego przykładu ty Wystawione:

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

stwierdzi:

  • 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.

Ale nie znaleźliśmy

  • foo/bar/baz.jar

Nowy Objaśnienie

To mówi szukać plików w „foo/bar /”, to nie pasuje, jeśli istnieją zero lub więcej znaków a następnie „JAR” i to nie więcej znaków ($ oznacza koniec linii), a następnie, jeśli tak nie jest, dopasuj dowolne następne znaki.

+0

whee! dzięki, teraz pójdę i spróbuję. –

+1

hmm, dobry pomysł, ale nie będzie działać tak, jak stwierdzono, ponieważ nie będzie pasował do plików bez żadnego rozszerzenia. Ale myślę, że mogę go przekształcić w to, czego potrzebuję. Część 'foo/bar /' jest łatwa, więc na razie o tym zapomnijmy. Jeśli możesz to naprawić, to pasuje do plików "baz.txt", "baz", "jar", "baz.jar.txt", "baz.jar.", "Baz." I "baz.txt. " ale NIE "baz.jar", to zaakceptuję. :-) –

+0

Hej Jason, rozumiem co masz na myśli. Właśnie zaktualizowałem swoją odpowiedź za pomocą działającego wyrażenia regularnego. Przetestowałem to na każdym wpisanym napisem. –

41

Odpowiedź od Michael jest doskonałym jeden, ale inną opcją jest po prostu pominąć:

foo/bar/** 

a następnie ręcznie dodać .jar plików. Zawsze możesz dodać pliki, które są wykluczone przez regułę ignorowania i nadpisują ignorowanie. Musisz tylko pamiętać, aby dodać wszystkie słoiki tworzone w przyszłości.

+0

Jak to zrobić ręcznie? Dodanie ich za pomocą "hg add" nie powiedzie się, ponieważ zostanie użyty plik ignorowania. Dodanie ich za pomocą "hg add -I" kończy się niepowodzeniem, ponieważ nadal obowiązuje plik ignorowania. Więc w jaki sposób można je zastąpić, ignorując plik? – Mecki

+3

Mecki, dodając je za pomocą polecenia "hg add" działa poprawnie - przesłonięcie ignoruje - pod warunkiem, że nie używasz symboli wieloznacznych w linii dodawania. Więc umieść foo/bar/** w twoim .hgignore, a następnie zrób "hg add foo/bar/path/specific.file" i jesteś gotowy. Jeśli masz mnóstwo wyjątków, możesz dodać status hg -u -n foo/bar/lots - *. Jar 'do' xargs hg add 'i zbiorczo dokonać jawnych przesłonięć. –

+1

i jeśli ktoś zmodyfikuje plik foo/bar/path/specific.file, to nadal będzie ignorowany? to nie jest rozwiązanie kolega – holms

Powiązane problemy