2010-07-14 107 views
5

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

文件:

  • 测试\ junk.txt
  • CMS \测试\ some_file.txt
  • CMS \语言\ USERS \ lang.txt
  • 语言\ lang2.txt
  • tests.txt
  • PROBA/tests.txt

我试着用这样的:

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

但这只能匹配以测试和语言启动文件:

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

我想要的是匹配

  • CMS \测试\ some_file.txt
  • CMS \语言\ USERS \ lang.txt

任何意见,将不胜感激。

+0

我改变了我的答案,现在它会工作。 – Omnifarious 2010-07-14 15:07:40

回答

2

使用水珠,他们是简单的:

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

我得到的印象是他正在寻找一种即使在新的顶级目录时也能正常工作的建议。 – 2010-07-14 13:58:22

+0

我也有这样的印象,在这种情况下,治疗是在上面添加的。 – msw 2010-07-14 14:11:15

+0

感谢您的快速回答。我试图把这个在我的.hgignore: 语法:glob的 测试/ * 语言/ * 但这是什么我想达到的对面。我不想忽略这些文件夹中的文件。我想忽略所有不属于 “测试”和“语言” – Danilo 2010-07-14 14:26:59

2

这不是您正在寻找的答案,但几乎没有人在其.hgignore文件中使用负宽度预览?:语法。如果他们只希望所有文件的一小部分被忽略,他们通常会忽略所有的东西,然后就会出现异常 - 请记住,在mercurial中(与cvs/svn不同),添加文件会忽略忽略。

因此,如果您.hgignore你必须:

.* 

,然后你在测试和语言目录倒是hg add文件明确用“汞添加”。那么你当然必须记得随时添加任何新文件,因为所有内容都将被忽略,但是如果大多数文件都被忽略,它仍然是更简单的方法。

+0

通常我不清楚问题是应该根据问题的约束来解答还是应该解决根本问题。如果是后者,这个答案是正确和完整的,但不好。 – msw 2010-07-14 14:19:14

+0

谢谢Ray4an的回答,但这是每一次都难以做到的。我的想法是忽略不在文件夹测试和语言中的所有文件。你知道我该怎么做? – Danilo 2010-07-14 14:28:43

-1

这是不可能的。

查看manpage

例如,假设我们有一个未经跟踪 文件file.c,我们 仓库里的A/B/file.c。如果.hgignore 中的任何模式匹配a/b/file.c,a/b或a,Mercurial将忽略 file.c。

所以我们说你犯了一个正则表达式不会匹配包含test和文件proba/tests.txt是在您的工作目录中的任何路径。该正则表达式将首先应用于proba并匹配哪个会导致该文件被忽略。

+0

它实际上是可能的。你错误的部分原因是可以锚定正则表达式,因此它们只能匹配路径的开头。 – Omnifarious 2010-07-14 15:12:02

+0

你将不得不通过提供一个来证明它,因为据我所知,生根或不生根本不重要。 – hwiechers 2010-07-14 16:20:52

+0

对不起,我错过了这个问题的一个重要部分。你是对的,这是不可能的。 – Omnifarious 2010-07-14 23:25:28

0

重点解决,这是从hgignore man page本节:

例如,假设我们有一个未经跟踪文件,file.c,以A/B/file.c我们的仓库里。如果.hgignore中的任何模式匹配/ b/file.c,a/b或a,Mercurial将忽略file.c。

为了忽略除了某些目录集以外的所有内容,我们必须在文件层次结构的每个级别上仔细忽略所有内容。假设你想忽略除了one/two/three /,one/two/four /和foo /之外的所有内容。首先,忽略一切,但一个/和富/:

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

路径的^(/|$)one|foo。接下来,忽略内部的一个家居/不是二/:

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

各地two括号是有一致性和是没有必要的。最后忽略两种一切/是不是三/或四/:

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

这很容易推广到任何这样的目录集。