2009-10-02 94 views
42

我需要一个.hgdontignore文件:-)来包含某些文件并排除目录中的所有文件。基本上我只想将.jar文件包含在特定的目录中,而不是其他的。我怎样才能做到这一点?我不擅长正则表达式语法。或者我可以用glob语法来完成它吗? (我更喜欢为了便于阅读)hgignore:帮助忽略除某些文件外的所有文件

就像一个示例位置,假设我想排除foo/bar/以外的所有文件,但foo/bar/*.jar除外。

回答

36

要做到这一点,你需要使用正则表达式:

foo/bar/.+?\.(?!jar).+ 

说明

你告诉它什么忽略,所以这个表达式搜索的东西,你不要't想要。

  1. 你看他的名字(包括相对目录)的任何文件包括(富/酒吧/)
  2. 你再去找它之前句号(。+?\任何字符。==匹配的一个或多个任何时间的字符,直到你到达周期字符)
  3. 然后确保它没有“jar”结尾(?!jar)(这称为负面展望
  4. 最后你抓住它的结局(。+)

正则表达离子很容易混淆,所以我强烈建议你得到一个像Regex Buddy这样的工具来帮助你建立它们。它会将正则表达式分解成简单的英语,这真的有帮助。

编辑

Jason S,你抓住了我,它确实怀念那些文件。

该修正的正则表达式会为你列出的每个例子的工作:

foo/bar/(?!.*\.jar$).+ 

它发现:

  • 富/酒吧/ baz.txt
  • 富/酒吧/巴兹
  • FOO/bar/jar
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar。
  • foo/bar/baz。
  • foo/bar/baz.txt。

,但是没有找到

  • 富/酒吧/巴兹。罐子

新解释

这是说找文件中的“富/酒吧/”,然后如果有零个或多个字符后跟“的.jar”再没有更多的字符不匹配($表示行的末尾),那么,如果不是这种情况,则匹配任何后面的字符。

+0

whee!谢谢,现在我去尝试一下。 – 2009-10-02 23:19:44

+1

嗯,好主意,但它不会像所述的那样工作,因为它不会匹配没有任何扩展名的文件。但我认为我可以将其变成我需要的东西。 'foo/bar /'部分很容易,所以暂时忘掉它。如果你可以修复它,使它匹配文件“baz.txt”,“baz”,“jar”,“baz.jar.txt”,“baz.jar。”,“baz。”和“baz.txt。 “但不是“baz.jar”,那么我会接受。 :-) – 2010-02-03 16:54:56

+0

嘿杰森,我明白你的意思了。我刚刚用一个正常的正则表达式更新了我的答案。我对您列出的每个字符串进行了测试。 – 2010-02-03 18:51:47

41

从迈克尔的回答是一个很好的一个,但另一个选择是只排除:

foo/bar/** 

,然后手动添加.jar文件。您始终可以添加忽略规则排除的文件,并覆盖忽略。你只需要记住添加你将来创建的任何罐子。

+0

你如何手动添加这些?使用“hg add”添加它们会失败,因为将使用忽略文件。使用“hg add -I”添加它们会失败,因为忽略文件仍然适用。那么它们如何被添加覆盖忽略文件呢? – Mecki 2009-10-20 15:13:21

+3

Mecki,使用'hg add'添加它们可以很好地工作 - 它会覆盖忽略 - 只要您不在添加行中使用通配符。所以把foo/bar/**放在你的.hgignore里,然后做'hg add foo/bar/path/specific.file',你就可以走了。如果你有大量的例外添加,你可以将'hg status -u -n foo/bar/lots - *。jar'管道扩展为'xargs hg add',并批量进行显式覆盖。 – 2009-10-20 17:57:07

+1

如果有人会修改foo/bar/path/specific.file,它仍然会被忽略?它不是一个解决方案伙伴 – holms 2011-09-07 12:50:25

相关问题