.hgignore含负向预查的正则无法匹配/的问题排查
问题原因及解决办法
你遇到的问题核心在于 Mercurial 在处理 hgignore 正则匹配时,传递给正则引擎的路径字符串不会包含末尾的斜杠——哪怕是目录路径也一样。
具体分析
你的原正则:
(?<![^/])\.(?!(idea|yarn)/)
意图是排除.idea/和.yarn/目录,但对于.idea这个目录本身,Mercurial传递的匹配字符串是.idea(不带末尾/)。此时正则里的(?!(idea|yarn)/)负向预查会判定为真(因为字符串结尾没有/),导致.idea目录被匹配,进而被Mercurial递归忽略,所以它下面的文件自然不会出现在hg status结果里。
而换成\b后,正则变成(?<![^/])\.(?!(idea|yarn)\b),此时.idea字符串结尾的\b(单词边界)会触发负向预查,让.idea目录不被匹配,所以它的子文件能正常显示。
正确的正则写法
如果想用接近你原思路的写法,可以调整正则,同时匹配目录结尾(字符串结束)和路径延续(带/)的情况:
syntax: regexp (?<![^/])\.(?!(idea|yarn)(/|$))
这个正则会排除以下两种情况:
- 点开头后紧跟
idea或yarn且是目录本身(字符串结尾) - 点开头后紧跟
idea或yarn且后续还有路径(带/)
这样就能准确忽略所有点开头的文件/目录,同时保留.idea/和.yarn/及其子内容。
验证
用这个正则后,执行hg status -n --color=no,.idea下的文件会正常显示,而其他点开头的文件(比如.env、.gitignore)会被忽略,符合你的需求。
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

