git - 将正则表达式语法转换为 glob(从 Mercurial 切换到 Git)

标签 git mercurial glob

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

我不得不说,我不清楚如何做诸如使模式仅适用于根级别之类的事情。我希望有人能给我相当于我的 .hgignore 中的以下示例行的 glob:

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

最佳答案

确实,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,并且除非您打算匹配类。* (用正则表达式术语)之后。在这些情况下,您可能需要:

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

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

$ cat .gitignore
foo

这告诉 Git 不要提示位于此点以下任何级别的名为 foo 的文件或目录,即在此文件夹或任何子文件夹中。另一方面:

$ cat .gitignore
/foo

意味着只有foo位于顶层,这对每个人来说都有意义。但奇怪的是:

bar/foo

与以下内容完全相同:

/bar/foo

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

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


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

关于git - 将正则表达式语法转换为 glob(从 Mercurial 切换到 Git),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57630365/

相关文章:

具有不同文件权限的git clone

c++ - Mercurial changeset c++分析

python - 捕获主目录中所有子文件夹中的所有 csv 文件 - Python 3.x

windows - Windows 上的 git 克隆

git - 我怎样才能计算出 git 标签和原始提交之间的时间差

python - 在 Jenkins 构建步骤中使用非托管文件

perl - glob 没有选择与模式匹配的所有文件,语法是否存在问题

git - 将存储库从 git 导入到 gerrit

asp.net-mvc - 开源存储库中的 Web.config

用于项目列表的 Python,到单个字符串?