【问题标题】:Can't ignore all files except *.m in directories不能忽略目录中除 *.m 之外的所有文件
【发布时间】:2014-05-29 14:53:38
【问题描述】:

我希望 Mercurial 自动忽略 repo 根目录和所有子目录中所有不以 '.m' 结尾的文件,但我无法做到这一点。

这是一个虚拟仓库(没有跟踪文件):

./.hgignore
./foo/abcdef.m
./foo/abcdef.txt
./abcdef.m
./abcdef.txt

这是.hgignore:

syntax: regexp
re:.*[^m]$

这就是发生的事情:

~/src/dummy$ hg st -A
? abcdef.m
I .hgignore
I abcdef.txt
I foo/abcdef.m
I foo/abcdef.txt

也就是说,abcdef.txt 和 foo/abcdef.txt 被忽略,但 foo/abcdef.m 也是如此,这不应该。

如果我将正则表达式更改为相反的:

syntax: regexp
re:.*[m]$

我得到了预期的结果:

~/src/dummy$ hg st -A
? .hgignore
? abcdef.txt
? foo/abcdef.txt
I abcdef.m
I foo/abcdef.m

.m 文件被忽略,.txt 文件不被忽略。

我做错了什么?为什么包含正则表达式(以“m”结尾)有效,而排他正则表达式(不以“m”结尾)无效?

Ubuntu 14.04 上的 Mercurial 2.8.2。

【问题讨论】:

  • 您的正则表达式不包括“foo”目录,因此不包括“foo/abcdef.m”。不知道如何最好地解决它。
  • 您可以尝试将您的正则表达式“植根”到字符串的开头吗?如果这可行(我没有要测试的 mercurial),我可以添加一个带有解释的答案:re:^.*[^m]$
  • 不,问题似乎是没有办法只匹配文件名而不匹配目录名。我想这个问题是无法解决的:(

标签: regex mercurial hgignore


【解决方案1】:

这是一个特定的限制,你不能排除所有,但...你可以阅读它here

限制

除了一组文件之外,没有直接的方法可以忽略所有文件。 尝试使用反向正则表达式匹配将失败 其他模式。这是一个有意的限制,作为替代 格式都被认为太容易混淆用户 值得额外的灵活性。

@sth 就在这里,您在第一次尝试时就完全阻止了 foo 子文件夹。

【讨论】:

  • 这真是一个可怕的限制!真的没有扩展来解决这个问题吗?
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 2012-08-17
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多