Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex hgignore正则表达式_Regex_Mercurial_Hgignore - Fatal编程技术网

Regex hgignore正则表达式

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/|

使用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/|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