Mercurial .hgignore正则表达式

时间:2010-07-14 13:44:02

标签: regex mercurial hgignore

使用Mercurial,我需要忽略除目录“tests”和“languages”以及这些目录中的文件之外的所有文件和目录。这一切都必须用正则表达式和.hgignoere

完成

文件:

  • 测试\ junk.txt
  • CMS \测试\ some_file.txt
  • CMS \语言\用户\ lang.txt
  • 语言\ lang2.txt
  • tests.txt
  • proba / tests.txt

我试过这个:

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

但这仅匹配以test和language开头的文件:

  • 测试\ junk.txt
  • 语言\ lang2.txt

我想要的是匹配

  • CMS \测试\ some_file.txt
  • CMS \语言\用户\ lang.txt

任何建议都将受到赞赏。

4 个答案:

答案 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并匹配,这将导致文件被忽略。