hgignore:帮助忽略所有文件,但忽略某些文件

时间:2009-10-02 22:15:30

标签: regex mercurial hgignore

我需要一个.hgdontignore文件:-)包含某些文件并排除目录中的所有其他内容。基本上我想只在特定目录中包含.jar文件而不包含任何其他内容。我怎样才能做到这一点?我不熟悉正则表达式语法。或者我可以使用glob语法吗? (我更喜欢可读性)

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

3 个答案:

答案 0 :(得分:42)

Michael的答案很好,但另一种选择是排除:

foo/bar/**

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

答案 1 :(得分:37)

为此,您需要使用此正则表达式:

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

<强>解释

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

  1. 您查找名称(包括相对目录)包含的任何文件(foo / bar /)
  2. 然后,您会查找一段时间之前的任何字符(。+?\。==匹配任何时间的一个或多个字符,直到您到达句点字符)
  3. 然后你确定它没有“jar”结尾(?!jar)(这被称为负面展望
  4. 最后你抓住它的结局(。+)
  5. 正则表达式很容易搞砸,所以我强烈建议您使用像Regex Buddy这样的工具来帮助您构建它们。它会将正则表达式分解成简单的英语,这确实有帮助。

    修改

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

    此更正的正则表达式适用于您列出的每个示例:

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

    它找到了:

    • 富/酒吧/ baz.txt
    • 富/酒吧/巴兹
    • 富/酒吧/罐
    • 富/酒吧/ baz.jar.txt
    • 富/酒吧/ baz.jar。
    • 富/酒吧/巴兹。
    • 富/酒吧/ baz.txt。

    但未找到

    • 富/酒吧/ baz.jar

    新解释

    这表示查找“foo / bar /”中的文件,如果有零个或多个字符后跟“.jar”然后再没有其他字符($表示行的末尾)则不匹配,那么,如果情况并非如此,请匹配以下任何字符。

答案 2 :(得分:1)

任何想要使用否定前行(或正则表达式语法中的?!)或任何类型的反向引用机制的人都应注意,Mercurial将从Google的RE2退回到Python的{{1} }模块进行匹配。

RE2是一种非回溯引擎,可确保运行时与输入大小成线性关系。如果性能对您很重要,也就是说,如果您的存储库很大,则应考虑使用Re2支持的更简单的模式,这就是为什么我认为solution offered by Ryan