Деятельный.hgignore регулярное выражение

используя Mercurial, мне нужно игнорировать все файлы и каталоги, кроме каталогов "тесты" и "языки" и файлов в этих каталогах. Что все должно быть сделано с regex и .hgignoere

файлы:

  • тестымусор.txt
  • cmstestssome_file.txt
  • cmslanguagesuserslang.txt
  • языкиlang2.txt
  • тесты.txt
  • proba / тесты.txt

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

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

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

  • тестымусор.txt
  • языкиlang2.txt

то, что я хочу, также соответствует

  • cmstestssome_file.txt
  • cmslanguagesuserslang.txt

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

4 ответов


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

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

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


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

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

.*

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


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

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

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

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

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

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

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

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

это легко обобщается к любому такому набору каталогов.


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

посмотреть manpage.

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

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