Деятельный.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
и будет соответствовать, что приведет к игнорированию файла.