Mercurial 中忽略文件的文件名模式

File name pattern for ignore files in Mercurial

我使用 TortoiseHg,我的文件夹结构如下:

testSet1
     test1
          filesystem
                    input_1.obj
                    output_1.obj
          etalon_1.obj
          result_1.obj
     test2
          filesystem
                    input_1.obj
                    output_1.obj
          etalon_1.obj
          result_1.obj
     ......
     errors.txt
......
result.xml

我只需要忽略目录 "testSetN/testN" 中的 .obj 文件,而不是目录 "testSetN/testN/filesystem" 中的文件。 我在 .hgignore 中使用 glob 模式“*/*/*.obj”,但它不起作用。 Mercurial 只是忽略所有目录(包括 "filesystem" 目录)中的所有 .obj 文件。但是如果我使用,例如,"testSet1/*/*.obj",那么一切正常。我怎样才能做我需要的? 我没有必要只使用 glob 语法。我将不胜感激。

正在查看https://www.selenic.com/mercurial/hgignore.5.html#syntax

Neither glob nor regexp patterns are rooted. A glob-syntax pattern of the form *.c will match a file ending in .c in any directory, and a regexp pattern of the form .c$ will do the same. To root a regexp pattern, start it with ^.

据此,glob */*/*.obj 将匹配 filesystem 目录中的 .obj 个文件,因为 glob 没有根目录。因此它通过在 testSetN/

处生成 glob 来匹配这些文件

如果所有文件夹都有 testSet 前缀,则可以使用 glob testSet*/*/*.obj。这样,它将忽略以 testSet 开头的目录的子目录中的 .obj 文件。 - 它也会忽略 a/testSetX/testY/Z.obj 以及 testSetN/testN/N.obj

Mercurial 还允许您手动添加根据 .hgignore 否则将被忽略的文件,因此您可以简单地忽略所有 .obj 文件,或使用 */*/*.objhg add 您要跟踪的文件。

编辑:添加评论中讨论的正则表达式。

如果您更喜欢正则表达式,或者没有将 glob 作为根的模式,则需要使用正则表达式。正则表达式 ^[^/]*/[^/]*/[^/]*\.obj$ 匹配任何 .obj 文件,正好位于存储库根目录的两个级别。即:

  • ^ 将匹配锚定在存储库的根目录中
  • [^/]*/匹配任意一级目录。这是任何不包含目录分隔符的字符序列 /
  • 再次
  • [^/]*/,匹配任意二级目录
  • [^/]*\.obj$ 匹配任何以 .obj
  • 结尾的文件名