如何定义hg忽略异常?

her*_*tao 3 mercurial tortoisehg hgignore

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

*.dll        # Exclude all dlls
!foo.dll     # Except for foo.dll 
Run Code Online (Sandbox Code Playgroud)

我们如何定义此类例外hgignore

Rei*_*nds 6

水银只允许例外忽略模式,以在限定忽略图案(通常是经由相同的规则进行编码 (?!...),(?<!...)或类似常规表达构建体),尽管它的匹配引擎是相当多的强大(并能在文件大小和其他原则匹配hg help filesets)中指定的东西.

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

组合性

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

性能

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

解决方案和解决方法

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

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

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

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

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