gitignore
能够通过使用可选前缀 ! 来定义忽略异常,for example , 为了不忽略特定文件 foo.dll
:
*.dll # Exclude all dlls
!foo.dll # Except for foo.dll
我们如何在 hgignore
中定义此类异常?
最佳答案
Mercurial 只允许忽略模式的异常被编码在定义忽略模式的同一规则中(通常通过 (?!...)
、 (?<!...)
或类似的正则表达式构造),即使它的匹配引擎相当强大(并且原则上可以匹配文件大小和 hg help filesets
中指定的其他内容。
这有两个原因,可组合性和性能。
可组合性
当您有模式的包含/排除系统时,顺序很重要。 Mercurial 有多种忽略文件的来源:.hgignore
存储库中的文件,以及任何 ui.ignore
和 ui.ignore.*
hgrc
中的选项Mercurial 处理的文件,以及 include:
包含的每个文件上面列表中的指令。允许规则以令人惊讶的方式在各种忽略文件中相互交互可能会导致难以调试的令人惊讶的情况。或者,一种模式(包含或排除)可以优先于其他模式,但这会带来其自身的问题。
性能
Mercurial 使用忽略文件来修剪目录树遍历。如果目录与忽略规则匹配,则会将其整个跳过(例如包含数千个临时文件的构建输出目录)。当你有一个与目录匹配的忽略模式,但也有一个与目录中的文件匹配的异常时,你的选择是要么不修剪目录遍历,要么忽略目录的异常(Git 选择执行后者)。不修剪目录遍历是低效的,忽略目录中的异常会严重限制正则表达式尚未很好处理的用例数量。
解决方案和解决方法
Mercurial 和 Git 之间的一个主要区别是,除了 glob 模式(Git 仅使用 glob 模式)之外,Mercurial 还提供了使用 Python 的扩展正则表达式的选项。对于大多数(但不是所有)用例,正则表达式消除了对异常的需要。
这些情况通常通过 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
的相关命令的选项文件。
关于mercurial - 如何定义 hg 忽略异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34540526/