【问题标题】:hgignore: help ignoring all files but certain oneshgignore:帮助忽略除某些文件以外的所有文件
【发布时间】:2010-12-03 11:31:44
【问题描述】:

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

作为一个示例位置,假设我想排除 foo/bar/ 下的所有文件,foo/bar/*.jar 除外。

【问题讨论】:

    标签: regex mercurial hgignore


    【解决方案1】:

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

    foo/bar/**
    

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

    【讨论】:

    • 你如何手动添加这些?使用“hg add”添加它们失败,因为将使用忽略文件。使用“hg add -I”添加它们失败,因为忽略文件仍然适用。那么如何添加它们以覆盖忽略文件?
    • Mecki,使用 'hg add' 添加它们可以正常工作——它会覆盖忽略——前提是您不在添加行中使用通配符。所以把 foo/bar/** 放在你的 .hgignore 中,然后执行 'hg add foo/bar/path/specific.file' 就可以了。如果您要添加大量异常,您可以通过管道将 'hg status -u -n foo/bar/lots-*.jar ' 传递给 'xargs hg add' 并批量执行显式覆盖。
    • 如果有人会修改 foo/bar/path/specific.file ,它仍然会被忽略吗?这不是一个解决方案伴侣
    • 不,一旦添加它就会被跟踪,因此如果有人修改了已添加的 foo/bar/path/specific.file,它将被检测为已更改。添加完全会覆盖忽略。
    • 如果不清楚,不带参数的“hg add”不适用于匹配 .hgignore 模式的文件。 'hg add ' 将添加文件,正如 Ry4an 所提到的,它将被视为普通存储库文件,因为 .hgignore 仅影响添加。
    【解决方案2】:

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

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

    说明

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

    1. 您查找名称(包括相对目录)包含 (foo/bar/) 的任何文件
    2. 然后查找句点之前的所有字符(.+?\. == 匹配任何时间的一个或多个字符,直到找到句点字符)
    3. 然后确保它没有“jar”结尾 (?!jar) (这称为负面展望
    4. 最后你抓住了它的结尾 (.+)

    正则表达式很容易弄乱,所以我强烈建议你使用像Regex Buddy 这样的工具来帮助你构建它们。它会将正则表达式分解成简单的英语,这真的很有帮助。

    编辑

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

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

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

    它发现:

    • foo/bar/baz.txt
    • foo/bar/baz
    • foo/bar/jar
    • foo/bar/baz.jar.txt
    • foo/bar/baz.jar.
    • foo/bar/baz.
    • foo/bar/baz.txt.

    但是没有找到

    • foo/bar/baz.jar

    新解释

    这表示在 "foo/bar/" 中查找文件,然后如果有零个或多个字符后跟 ".jar" 并且没有更多字符($ 表示行尾),则不匹配,然后,如果不是这样,匹配任何以下字符。

    【讨论】:

    • hmm,好主意,但它不会像说明的那样工作,因为它根本不会匹配没有任何扩展名的文件。但我想我可以把它变成我需要的东西。 foo/bar/ 部分很简单,所以让我们暂时忘记它。如果您可以修复它,使其匹配文件“baz.txt”、“baz”、“jar”、“baz.jar.txt”、“baz.jar.”、“baz.”和“baz.txt”。 "但不是“baz.jar”,那么我会接受。 :-)
    • 嘿,杰森,我明白你的意思了。我刚刚用一个有效的正则表达式更新了我的答案。我针对您列出的每个字符串进行了测试。
    • 这个解决方案对我来说效果很好,但我只是想补充一点,.hgignore 文件在使用之前应该有syntax: regexp。您可以稍后在文件中恢复为syntax: glob
    • 你也可以使用 re:foo/bar/(?!.*\.jar$).+ 来代表那一行。
    【解决方案3】:

    任何想要使用负前瞻(或正则表达式语法中的?!)或任何类型的反向引用机制的人都应该知道,Mercurial 将从 google 的 RE2 退回到 Python 的 re 模块进行匹配。

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

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2011-03-21
      • 2017-02-17
      相关资源
      最近更新 更多