2010-07-14 6 views
5

Используя Mercurial, мне нужно игнорировать все файлы и каталоги, кроме каталогов «тесты» и «языки» и файлы в этих каталогах. Это все должно быть сделано с регулярным выражением и .hgignoereMercurial .hgignore regular expression

файлов:

  • тестов \ junk.txt
  • Cms \ тесты \ some_file.txt
  • СХ \ Языки \ Users \ lang.txt
  • языки \ lang2.txt
  • tests.txt
  • проба/tests.txt

Я пытался с этим:

^(?!test|test/|test$|languages|languages/|languages$) 

, но это соответствует только файлам, которые начинаются с тестом и языком:

  • тестов \ junk.txt
  • языков \ lang2.txt

Я хочу совладать также

  • КМВ \ Тесты \ some_file.txt
  • СЦИ \ Языки \ Users \ lang.txt

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

+0

Я изменил свой ответ, и теперь он будет работать. – Omnifarious

ответ

2

Используйте шарики, они проще:

C:> dir 
tests languages pr0n espionage more_pr0n 

C:> type .hgignore 
syntax: glob 
pr0n/* 
espionage/* 
more_pr0n/* 

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

hg add .hgignore 
hg commit 
echo "new_directory/*" >> .hgignore 
hg commit 

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

+0

У меня создается впечатление, что он ищет предложение, которое работает даже при новых каталогах верхнего уровня. –

+0

У меня тоже сложилось впечатление, и в этом случае лекарство добавляется выше. – msw

+0

Спасибо за быстрый ответ. Я попытался сделать это в моем .hgignore: синтаксиса: шарик тестов/* языков/* Но это противоположно то, что я хочу достичь. Я не хочу игнорировать файлы в этой папке. Я хочу игнорировать все файлы/папки, которые не являются членами «тесты» и «языки» – Danilo

2

Это не тот ответ, который вы ищете, но почти никто не использует синтаксис ?: с отрицательной шириной в своих файлах .hgignore. В тех случаях, когда они хотят, чтобы только небольшое подмножество всех файлов было неизмеримым, они обычно просто игнорируют все, а затем hg add исключения - помните, что в mercurial (в отличие от cvs/svn) добавление переопределения файла игнорируется.

Так что, если ваш .hgignore вы бы:

.* 

, а затем вы бы hg add файлов в тестах и ​​языках каталогах явно с «рт.ст. добавить». Вы, конечно, должны помнить о добавлении любых новых файлов по мере того, как все будет проигнорировано, но если большинство файлов должны быть проигнорированы, это еще проще.

+0

Мне часто неясно, должен ли отвечать вопрос в соответствии с ограничениями вопроса или если проблема корня должна быть решена. Если последний, этот ответ правильный и завершенный, но не хороший. – msw

+0

Спасибо Ray4an за ответ, но это трудно делать каждый раз. Моя идея - игнорировать все файлы, отсутствующие в тестах папок и языках. Вы знаете, как я могу это сделать? – Danilo

-1

Невозможно.

См. manpage.

Например, скажем, у нас есть неотслеживаемый файл, file.c, в/б/file.c внутри нашего хранилища. Mercurial будет игнорировать файл file.c, если любой шаблон в .hgignore соответствует a/b/file.c, a/b или a.

Так скажем, вы делаете регулярное выражение, которое не будет соответствовать любому пути, содержащему test и файл proba/tests.txt находится в рабочем каталоге. Это регулярное выражение будет сначала применено к proba и будет соответствовать тому, что приведет к игнорированию файла.

+0

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

+0

Вам нужно будет доказать это, поставив его, потому что, насколько я могу судить, укоренение или нет не должно иметь значения. – hwiechers

+0

Прошу прощения, я пропустил важную часть вопроса. Вы правы, это невозможно. – Omnifarious

0

Ключ к решению этого этот раздел из hgignore man page:

Например, скажем, у нас есть неотслеживаемый файл, file.c, в/б/file.c в нашем хранилище. Mercurial будет игнорировать file.c, если любой шаблон в .hgignore соответствует a/b/file.c, a/b или a.

Чтобы игнорировать все, кроме определенного набора каталогов, мы должны тщательно игнорировать все на каждом уровне иерархии файлов. Предположим, вы хотите игнорировать все, кроме одного/двух/три /, одного/двух/четырех/и foo /. Во-первых, игнорировать все, кроме одного/и обув /:

^(?!(one|foo)(/|$))

В ^ и (/|$) якорь one|foo в пути. Далее, игнорировать все внутри одного/то есть не два /:

^one/(?!(two)(/|$))

Скобки вокруг two есть согласованность и не являются необходимыми. И, наконец, игнорировать все, что в двух /, что не три/или четыре /:

^one/two/(?!(three|four)(/|$))

Это легко обобщается на любой такой набор каталогов.