由于 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
就是 .project
。1 等价于 \.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/