【问题标题】:File name pattern for ignore files in MercurialMercurial 中忽略文件的文件名模式
【发布时间】:2015-09-03 16:43:42
【问题描述】:

我使用 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 只是忽略所有目录(包括“文件系统”目录)中的所有 .obj 文件。但是,例如,如果我使用“testSet1/*/*.obj”,那么一切正常。我怎样才能做我需要的? 我没有必要只使用 glob 语法。我将不胜感激。

【问题讨论】:

  • 将任何 obj 添加到您的 repo 似乎很奇怪

标签: regex mercurial glob tortoisehg hgignore


【解决方案1】:

看着https://www.selenic.com/mercurial/hgignore.5.html#syntax

glob 和 regexp 模式都没有根。 *.c 形式的全局语法模式将匹配任何目录中以 .c 结尾的文件,而 .c$ 形式的正则表达式模式将执行相同的操作。要根正则表达式模式,请以 ^ 开头。

据此,glob */*/*.obj 将匹配 filesystem 目录内的 .obj 文件,因为 glob 没有 root。因此,它通过将 glob 置于testSetN/ 来匹配这些文件

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

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

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

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

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

【讨论】:

  • "要根植一个正则表达式模式,请以 ^ 开头。"所以,我尝试使用正则表达式“^(.*/.*/.*)\.obj$”,但它也不起作用。为什么?
  • 因为. 也匹配路径中的/,所以正则表达式将匹配任何至少比根目录深两层的文件。尝试匹配anything but / 而不是any character,即^[^/]*/[^/]*/[^/]*\.obj$
  • 谢谢。 "^[^/]*/[^/]*/[^/]*\.obj$" 适合我!
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2011-10-02
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多