繁体   English   中英

如何定义hg忽略异常?

[英]How to define hg ignore exceptions?

gitignore能够通过使用可选前缀来定义忽略异常 例如 ,为了不忽略特定文件foo.dll

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

我们怎样才能在hgignore定义这样的异常?

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

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

组合性

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

性能

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

解决方案和解决方法

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

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

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选项添加到相关命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM