6

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

文件:

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

我试过这个:

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

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

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

我想要的是也匹配

  • cms\tests\some_file.txt
  • cms\语言\用户\lang.txt

任何意见,将不胜感激。

4

4 回答 4

2

这不是您要寻找的答案,但几乎没有人?:在他们的 .hgignore 文件中使用负宽度前瞻语法。如果他们只想忽略所有文件的一小部分,他们通常会忽略所有内容,然后忽略hg add异常——请记住,在 mercurial 中(与 cvs/svn 不同)添加文件会覆盖忽略。

因此,如果您的 .hgignore 您将拥有:

.*

然后你会hg add在你的测试和语言目录中使用'hg add'明确的文件。然后,您当然必须记住在执行过程中添加任何新文件,因为所有内容都将被忽略,但如果大多数文件都应该被忽略,那么它仍然是更简单的方法。

于 2010-07-14T14:08:27.727 回答
1

使用 glob,它们更简单:

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

如果您的源目录中弹出太多目录和文件而无法使用此方法,请创建一个仅源目录。

于 2010-07-14T13:54:16.437 回答
1

解决这个问题的关键是hgignore 手册页中的这一部分:

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

为了忽略除特定目录集之外的所有内容,我们必须小心地忽略文件层次结构中每一级的所有内容。假设您想忽略除一/二/三/、一/二/四/和 foo/ 之外的所有内容。首先,忽略除 one/ 和 foo/ 之外的所有内容:

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

和锚点在路径中^。接下来,忽略一个/不是两个/的所有内容:(/|$)one|foo

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

周围的括号two是为了保持一致性,不是必需的。最后忽略两个/不是三个/或四个/的所有内容:

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

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

于 2013-05-22T01:49:24.140 回答
0

这是不可能的。

请参阅手册页

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

因此,假设您创建了一个不匹配任何路径的正则表达式,test并且该文件proba/tests.txt位于您的工作目录中。该正则表达式将首先应用于proba并匹配,这将导致文件被忽略。

于 2010-07-14T14:28:10.170 回答