【问题标题】:How to define hg ignore exceptions?如何定义 hg 忽略异常?
【发布时间】:2016-04-05 01:51:30
【问题描述】:

gitignore 能够通过使用可选前缀 !for example 来定义忽略异常,以便不忽略特定文件 foo.dll

*.dll        # Exclude all dlls
!foo.dll     # Except for foo.dll 

我们如何在hgignore 中定义此类异常?

【问题讨论】:

标签: mercurial tortoisehg hgignore


【解决方案1】:

Mercurial 只允许异常忽略模式在定义忽略模式的相同规则中编码(通常通过(?!...)(?<!...) 或类似的正则表达式构造),即使它的匹配引擎功能强大得多(并且原则上可以匹配hg help filesets中指定的文件大小和其他内容。

这有两个原因,可组合性和性能。

可组合性

如果您有一个包含/排除模式的系统,那么顺序很重要。 Mercurial 有各种忽略文件的来源:存储库中的 .hgignore 文件,以及 Mercurial 处理的 hgrc 文件中的任何 ui.ignoreui.ignore.* 选项,以及 include: 指令包含的每个文件以上列表。允许规则以令人惊讶的方式在各种忽略文件中相互交互可能会导致难以调试的令人惊讶的情况。或者,一种模式(包含或排除)可以优先于其他模式,但这会带来其自身的问题。

性能

Mercurial 使用忽略文件来修剪目录树遍历。如果目录与忽略规则匹配,则将整个跳过(例如具有数千个临时文件的构建输出目录)。当您有一个与目录匹配的忽略模式,但也有一个与目录中的文件匹配的异常时,您的选择是不修剪目录遍历或忽略目录的异常(Git 选择执行后者)。不修剪目录遍历是低效的,忽略目录中的异常会严重限制正则表达式尚未很好处理的用例数量。

解决方案和变通方法

Mercurial 和 Git 之间的主要区别在于,Mercurial 提供了在 glob 模式之外使用 Python 的扩展正则表达式的选项(Git 仅使用 glob 模式)。正则表达式消除了大多数(但不是全部)用例对异常的需求。

这些情况通常可以通过.hgignore 文件中的re:(?!exception)pattern 行来充分处理(在某些情况下,还可以使用其他高级正则表达式模式)。请注意,(?x) 元模式会忽略正则表达式中的未转义空格和 cmets,这对于使复杂表达式更具可读性很有用。比如下面两个是等价的:

re:(?x) (^|/) (?!foobar) foo # do not ignore files starting with `foobar`.
re:(^|/)(?!foobar)foo

这适用于忽略文件,因为文件模式很少包含空格或哈希符号。另请注意,即使您通常使用syntax: glob,也可以通过在其前面加上re:regexp: 来逐行切换到正则表达式语法。

如果这还不够,如果没有其他合理适用的选项,可以通过扩展修改现有行为。您可以覆盖mercurial.dirstate.dirstate.{_ignore,_dirignore},也可以根据(例如).hginclexcl 文件自动将-I/-X 选项添加到相关命令中。

【讨论】:

  • 非常透彻,但没有明确回答问题
  • 这是因为无法回答问题(“我们如何……”)。 Git 和 Mercurial 具有不同的机制,无法完全相互模仿。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多