2010-02-11 7 views
10

Использование Mercurial, мне нужно игнорировать все файлы, кроме тех, которые находятся в определенном каталоге под названием «хранители».Mercurial .hgignore Negative Lookahead

На первый взгляд, это казалось простым использованием Regex и Negative Lookahead; однако, хотя я могу проверить свое регулярное выражение в Regex Buddy и других инструментах, в TortoiseHg, он работает не так, как ожидалось.

Файлы:

  • барахло \ junk.txt
  • барахло \ текст
  • хранители \ тест \ тест
  • хранители \ тест \ test2 \ hi.txt
  • keepersblah.txt

Нельзя игнорировать только два файла под хранителями.

Вот регулярное выражение я надеялся, что будет работать:

^(?!keepers/).+$ 

К сожалению, это приводит к все файлы будут игнорироваться. Если я изменю его на:

^(?!keepers).+$ 

он работает так, как вы ожидали. То есть он игнорирует любые файлы/папки, которые не запускаются с хранителями. Но я хочу игнорировать файлы, которые начинаются с хранителей.

Причудлив, если я могу изменить его к этому:

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

Это будет правильно соответствовать папке, но это не будет игнорировать файлы, которые не в хранителях папки, если они не имеют расширения.

Любые советы будут оценены.

удаления мертвой ссылке Imageshack

ответ

7

Проблема с вашим первым выражением является то, что регулярное выражение также протестировали против «хранители» само по себе. Этот случай может быть добавлена ​​с дополнительным условием:

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

или (менее компактным, но проще понять):

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

Я также попытался '^ (?! хранители \ б)', но не удалось «keepers.txt» – eswald

+0

Блестящий! Большое вам спасибо, оба отлично работали. Я бил головой в течение часа :) –

+2

В ожидающем утверждения нет необходимости в неадаптирующих группах, так как он еще не взят: '^ (?! keepers (/ | $)). *' – Tomalak