使用Mercurial,我需要忽略除目录“tests”和“languages”以及这些目录中的文件之外的所有文件和目录。这一切都必须用正则表达式和.hgignoere
完成文件:
我试过这个:
^(?!test|test/|test$|languages|languages/|languages$)
但这仅匹配以test和language开头的文件:
我想要的是匹配
任何建议都将受到赞赏。
答案 0 :(得分:2)
这不是您正在寻找的答案,但几乎没有人在他们的.hgignore文件中使用负宽度前瞻?:
语法。如果他们只想让所有文件的一小部分无法使用,他们通常会忽略所有内容,然后hg add
例外 - 记住在mercurial中(与cvs / svn不同)添加文件会覆盖忽略。
所以如果你的.hgignore你有:
.*
然后使用'hg add'明确地hg add
测试和语言目录中的文件。那么你当然必须记住随时添加任何新文件,因为一切都将被忽略,但如果大多数文件都应该被忽略,那么它仍然是更容易的方法。
答案 1 :(得分:1)
使用globs,它们更简单:
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
如果您的源目录中有太多目录和文件弹出以使此方法有效,请创建一个仅源目录。
答案 2 :(得分:1)
解决这个问题的关键是hgignore man page:
中的这一部分例如,假设我们在我们的存储库内的/ b / file.c中有一个未跟踪的文件file.c。如果.hgignore中的任何模式与/ b / file.c,a / b或a匹配,Mercurial将忽略file.c。
为了忽略除某一组目录之外的所有内容,我们必须小心忽略文件层次结构的每个级别的所有内容。假设你想忽略除了一/二/三/,一/二/四/和foo /之外的所有东西。首先,忽略除了一个/和foo /:
之外的所有内容 ^(?!(one|foo)(/|$))
路径中的^
和(/|$)
锚点one|foo
。接下来,忽略一个/不是两个/:
^one/(?!(two)(/|$))
two
周围的括号是一致的,不是必需的。最后忽略一下两个/不是三个/或四个/:
^one/two/(?!(three|four)(/|$))
这很容易推广到任何这样的目录集。
答案 3 :(得分:0)
这是不可能的。
请参阅manpage。
例如,假设我们没有跟踪 file,file.c,在我们的a / b / file.c里面 库。 Mercurial会忽略 file.c如果.hgignore中有任何模式 匹配a / b / file.c,a / b或a。
因此,假设您创建的正则表达式与包含test
的任何路径都不匹配,并且文件proba/tests.txt
位于您的工作目录中。该正则表达式将首先应用于proba
并匹配,这将导致文件被忽略。