Regex hgignore正则表达式
使用Mercurial,我需要忽略除“tests”和“languages”目录以及这些目录中的文件之外的所有文件和目录。所有这些都必须使用regex和.hgignoere完成 档案:Regex hgignore正则表达式,regex,mercurial,hgignore,Regex,Mercurial,Hgignore,使用Mercurial,我需要忽略除“tests”和“languages”目录以及这些目录中的文件之外的所有文件和目录。所有这些都必须使用regex和.hgignoere完成 档案: tests\junk.txt cms\tests\some_file.txt cms\languages\users\lang.txt 语言\lang2.txt tests.txt proba/tests.txt 我试过这个: ^(?!test|test/|test$|languages|languages/|
- tests\junk.txt
- cms\tests\some_file.txt
- cms\languages\users\lang.txt
- 语言\lang2.txt
- tests.txt
- proba/tests.txt
^(?!test|test/|test$|languages|languages/|languages$)
但这只匹配以test和language开头的文件:
- tests\junk.txt
- 语言\lang2.txt
- cms\tests\some_file.txt
- cms\languages\users\lang.txt
任何建议都将不胜感激。使用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
如果源目录中弹出的目录和文件太多,无法使用此方法,请创建一个纯源目录。这不是您要寻找的答案,但几乎没有人在其.hgignore文件中使用负宽度前瞻
?:
语法。如果他们只想忽略所有文件中的一小部分,他们通常会忽略所有内容,然后hg add
exceptions——请记住,在mercurial(与cvs/svn不同)中,添加文件会覆盖忽略
因此,如果您的.hg忽略,您将:
.*
然后您将hgadd
测试和语言目录中的文件显式地使用“hgadd”。当然,您必须记住在运行过程中添加任何新文件,因为所有内容都将被忽略,但如果大多数文件都应该被忽略,那么这仍然是更简单的方法。这是不可能的
看
例如,假设我们有一个未跟踪的
文件,file.c,在我们的
存储库。Mercurial将忽略
如果.hgignore中有任何模式,则使用.c文件
匹配a/b/file.c、a/b或a
假设您创建的正则表达式与包含
test
的任何路径都不匹配,并且文件proba/tests.txt
位于您的工作目录中。该正则表达式将首先应用于proba
,并将匹配,这将导致忽略该文件 解决这一问题的关键在于:
例如,假设我们的存储库中有一个未跟踪的文件file.c,位于a/b/file.c。如果.hgignore中的任何模式与a/b/file.c、a/b或a匹配,Mercurial将忽略file.c。
为了忽略除某一组目录之外的所有内容,我们必须仔细地忽略文件层次结构的每个级别上的所有内容。假设您想忽略除1/2/3/、1/2/4/和foo/之外的所有内容。首先,除了一个/和一个/外,忽略一切:
^(?(一个foo)(/|$)
路径中的^
和(/|$)
锚定one | foo
。接下来,忽略1/中的所有内容,而不是2/:
^one/(?!(二)(/|$)
two
周围的括号用于保持一致性,不需要。最后忽略2/中的所有内容,而不是3/或4/:
^1/2/(?!(3/4)(/|$)
这很容易推广到任何这样的目录集。我感觉他在寻找一个即使是在新的顶级目录时也有效的建议。我也有这种感觉,在这种情况下,解决方法添加到了上面。谢谢你的快速回答。我试着在我的.hgignore:syntax:glob tests/*languages/*中加入这一点,但这与我想要实现的相反。我不想忽略那些文件夹中的文件。我想忽略所有不是“测试”和“语言”成员的文件/文件夹我了解您想要什么,我的意思是,你想要的是糟糕的实践,这也是为什么它很难的部分原因。这个答案并没有说明为什么不可能按照OP希望的方式使用
.hgignore
。我常常不清楚是否应该根据问题的约束来回答这个问题,或者是否应该解决根本问题。如果是后者,这个答案是正确和完整的,但不是很好。谢谢Ray4an的回答,但每次都很难做到。我的想法是忽略所有不在测试和语言文件夹中的文件。你知道我怎么做吗?为什么人们不使用语法?文档说该模式是一个Python正则表达式。莫名其妙地,Mercurial中不支持Python功能吗?啊,负面前瞻在.hgignore
中确实有效。在我的例子中,我只是把我的表达式写错了(我需要一个$
在我的负面展望中)。我改变了我的答案,现在它可以工作了。这实际上是可能的。你错的部分原因是,可以锚定正则表达式,使它们只在路径的开头匹配。你必须提供一个来证明这一点,因为据我所知,是否支持并不重要。对不起,我错过了问题的一个重要部分。你是对的,这是不可能的。如果Mercurial被更改为提示匹配是针对某个目录的,那么这是可能的。然而,现在对他们来说改变这个已经太晚了,因为这会破坏他们的API。例如,我的意思是,如果Mercurial尝试匹配a/
,然后再匹配a/b/
,然后再匹配a/b/file.c
,则可以编写模式。我认为您正确地确定了Mercurial的关键问题,这使得这一点变得不可能。可能可以编写扩展而不是使用.hgignore
?