Mercurial .hgignore отрицательный просмотр вперед

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

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

Файлы:

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

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

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

^(?!keepers/).+$

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

^(?!keepers).+$

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

Как ни странно, если я поменяю его на это:

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

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

Любой совет будет принят во внимание.

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


person Michael La Voie    schedule 11.02.2010    source источник


Ответы (1)


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

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

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

^(?!keepers/|keepers$)
person eswald    schedule 11.02.2010
comment
Я тоже пробовал ^(?!keepers\b), но с keepers.txt ничего не вышло. - person eswald; 11.02.2010
comment
Блестяще! Большое спасибо, оба работали отлично. Уже час бью головой :) - person Michael La Voie; 11.02.2010
comment
В прогнозном утверждении нет необходимости в группах без захвата, поскольку они все равно не захватываются: ^(?!keepers(/|$)).* - person Tomalak; 11.02.2010