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,除非您打算在此之后匹配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 模式来表达了。