【问题标题】:Convert regex syntax to glob (switching from Mercurial to Git)将正则表达式语法转换为 glob(从 Mercurial 切换到 Git)
【发布时间】:2019-08-23 16:55:20
【问题描述】:

由于 Bitbucket 正在逐渐停止对 Mercurial 的支持,因此我在一些项目中从 Mercurial 切换到了 Git。这看起来很简单,但我认为,我需要对我的 .hgignore 文件进行一些手动更改,以便它们可以用作 .gitignore,因为它们使用我认为 Git 不支持的正则表达式语法。

我不得不说我不清楚如何使模式仅适用于根级别。我希望有人可以从我的 .hgignore 中给我与以下示例行等效的 glob:

\.project
\.settings/
\.idea/
^out/
web-app/WEB-INF/classes

【问题讨论】:

    标签: git mercurial glob


    【解决方案1】:

    Mercurial 的 .hgignore 确实比 Git 的 .gitignore 灵活得多,因为 Mercurial 支持正则表达式 glob 语法。然而,glob 语法往往更容易正确,我甚至在 Mercurial 中也推荐它(它曾经很慢,但现在 glob 在内部被翻译成正则表达式,所以应该不会有真正的速度损失)。

    \.project 的等价物就是.project1\.settings/ 的等价物就是.settings/。这也适用于.idea/。这里唯一稍微困难的是^out/web-app/WEB-INF/classes。你当然想要:

    /out/
    

    在 Git 中将out/ 部分锚定到.gitignore 文件出现的级别,而您可能想要一个简单的:

    web-app/WEB-INF/classes
    

    除非您打算在此点以下的任何级别匹配两个名称组件系列web-app/WEB-INF,除非您打算在此之后匹配classes.*(以正则表达式术语)。在这些情况下,您可能需要:

    **/web-app/WEB-INF/classes*
    

    或类似的。前导 **/ 的原因是,在 Git .gitignore 文件中,任何带有 embedded 斜杠的 glob 模式都等同于以斜杠开头的相同模式。那就是:

    $ cat .gitignore
    foo
    

    这告诉 Git 不要在 此点下的任何级别(即在此文件夹或任何子文件夹中)抱怨名为 foo 的文件或目录。另一方面:

    $ cat .gitignore
    /foo
    

    表示只有foo在顶层,这对每个人来说也都有意义。但奇怪的是:

    bar/foo
    

    与以下内容完全相同:

    /bar/foo
    

    因为嵌入的(不是尾随的)斜杠意味着“仅在此文件夹中匹配”,就像前导斜杠一样。

    (尾随斜线表示“只有一个子目录/子文件夹应该符合这个规则”。它们被删除只是为了“是否有斜线”测试;如果在删除任何斜线后有斜线尾随一个,整个事情都锚定到这个特定的文件夹/目录。)


    1如果我需要更多弹药来支持 glob 而不是正则表达式,\.project 可能错误,因为它还排除了一个名为 this.project.file 的文件。但如果你真的确实指的是 ^.*\.project.*$ 的等价物,那就很难用 glob 模式来表达了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 2012-02-03
      • 2023-03-14
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多