2009-10-02 3 views
42

Мне нужен файл .hgdontignore :-) для включения определенных файлов и исключения всего остального в каталоге. В основном я хочу включить только файлы .jar в конкретный каталог и ничего больше. Как я могу это сделать? Я не настолько квалифицирован в синтаксисе регулярных выражений. Или я могу сделать это с помощью синтаксиса glob? (Я предпочитаю это для удобочитаемости)hgignore: помогает игнорировать все файлы, но некоторые из них

Как пример, предположим, что я хочу исключить все файлы под foo/bar/, за исключением foo/bar/*.jar.

ответ

36

Чтобы сделать это, вы должны будете использовать это регулярное выражение:

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

Пояснение

Вы говорите ему, что игнорировать, так это выражение ищет вещи, которые вы дон 't хотите.

  1. Глядит для любого файла, имя которого (в том числе относительного каталога) включает в себя (Foo/бар /)
  2. Вы тогда искать любые символы, которые предшествуют период (. +? \. == матча один или более символы любого времени, пока вы не достигнете символа периода)
  3. Затем вы убедитесь, что у него нет конца «jar» (?! jar) (Это называется негативным взглядом вперед
  4. Наконец, вы зацепите его имеет (. +)

Regular express ионы легко запутаться, поэтому я настоятельно рекомендую вам получить такой инструмент, как Regex Buddy, чтобы помочь вам их построить. Он будет разбивать регулярное выражение на простой английский, что действительно помогает.

EDIT

Эй Jason S, вы поймали меня, это не пропустите эти файлы.

Это исправлено регулярное выражение будет работать для каждого примера вы перечислили:

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

Он находит:

  • Foo/бар/baz.txt
  • Foo/бар/БАЗ
  • Foo/бар/балка
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar.
  • foo/bar/baz.
  • foo/bar/baz.txt.

Но не находит

  • Foo/бар/Baz.баночка

Новое объяснение

Это говорит искать файлы в «Foo/бар /», то не совпадают, если есть ноль или более символов с последующим «.jar», а затем не более символов ($ означает конец строки), тогда, если это не так, сопоставьте любые следующие символы.

+0

whee! спасибо, теперь я пойду и попробую. –

+1

Хм, хорошая идея, но она не будет работать, как указано, так как она не будет соответствовать файлам без какого-либо расширения вообще. Но я думаю, что смогу превратить его в то, что мне нужно. Часть 'foo/bar /' проста, поэтому давайте забудем об этом на данный момент. Если вы можете исправить это, это соответствует файлам «baz.txt», «baz», «jar», «baz.jar.txt», «baz.jar.», «Baz.» И «baz.txt». " но НЕ «baz.jar», тогда я соглашусь. :-) –

+0

Эй, Джейсон, я понимаю, что вы имеете в виду. Я просто обновил свой ответ с рабочим регулярным выражением. Я проверил его против каждой строки, которую вы указали. –

41

Ответ от Майкла является прекрасным один, но другой вариант просто исключить:

foo/bar/** 

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

+0

Как вы их вручную добавляете? Добавление их с помощью «hg add» не выполняется, поскольку файл игнорирования будет использоваться. Добавление их с помощью «hg add -I» завершается с ошибкой, так как все еще применяется файл игнорирования. Итак, как их можно добавить, переопределяя файл игнорирования? – Mecki

+3

Mecki, добавляя их с помощью «hg add», отлично работает - он отменяет игнорирование - при условии, что вы не используете подстановочные знаки в своей строке добавления. Поэтому поместите foo/bar/** в свой .hgignore, а затем сделайте «hg add foo/bar/path/specific.file», и вам хорошо идти. Если у вас есть тонна исключений для добавления, вы можете передать статус hg -u -n foo/bar/lots - *. Jar 'в' xargs hg add 'и делать свои явные переопределения навалом. –

+1

, и если кто-то изменит файл foo/bar/path/specific.file, он все равно будет проигнорирован? это не решение mate – holms

Смежные вопросы