Mercurial .hgignore регулярное выражение - PullRequest
6 голосов
/ 14 июля 2010

Используя Mercurial, мне нужно игнорировать все файлы и каталоги, кроме каталогов "tests" и "languages" и файлов в этих каталогах.Это все должно быть сделано с помощью регулярных выражений и .hgignoere

Файлы:

  • tests \ junk.txt
  • cms \ tests \ some_file.txt
  • cms \ languages ​​\ users \ lang.txt
  • languages ​​\ lang2.txt
  • tests.txt
  • proba / tests.txt

Я пробовал с этим:

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

, но это соответствует только файлам, начинающимся с test и language:

  • tests \ junk.txt
  • languages ​​\ lang2.txt

Я хочу также сопоставить

  • cms \ tests \ some_file.txt
  • cms \ languages ​​\ users \ lang.txt

Буду признателен за любой совет.

Ответы [ 4 ]

2 голосов
/ 14 июля 2010

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

То есть, если у вас есть .hgignore, у вас будет:

.*

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

1 голос
/ 22 мая 2013

Ключом к решению этой проблемы является этот раздел со справочной страницы hgignore :

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

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

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

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

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

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

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

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

1 голос
/ 14 июля 2010

Используйте глобусы, они проще:

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 голосов
/ 14 июля 2010

Это невозможно.

См. Справочную страницу .

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

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

...