gitignore
能够通过使用可选前缀!,for example来定义忽略异常,以便不忽略特定文件foo.dll
:
*.dll # Exclude all dlls
!foo.dll # Except for foo.dll
我们如何在hgignore
中定义此类例外?
答案 0 :(得分:6)
Mercurial只允许异常忽略在定义忽略模式的同一规则中编码的模式(通常通过(?!...)
,(?<!...)
或类似的正则表达式构造),即使它的匹配引擎相当大功能更强大(原则上可以匹配文件大小和hg help filesets
中指定的其他内容)。
这有两个原因,可组合性和性能。
如果您有模式的包含/排除系统,那么订购很重要。 Mercurial具有忽略文件的各种来源:存储库中的.hgignore
文件,以及Mercurial处理的ui.ignore
文件中的任何ui.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
这对于忽略文件非常有效,因为文件模式很少包含空格或哈希符号。另请注意,即使您通常使用re:
,也可以通过在regexp:
或syntax: glob
前添加前缀逐行切换为正则表达式语法。
如果不充分,如果没有合理适用的其他选项,可以通过扩展修改现有行为。您可以覆盖mercurial.dirstate.dirstate.{_ignore,_dirignore}
,也可以根据(例如)-I/-X
文件自动将.hginclexcl
选项添加到相关命令。