如何从Mercurial/TortoiseHG的.hgignore文件中排除文件夹列表?
如何从Mercurial/TortoiseHG的.hgignore文件中排除文件夹列表?
好的。我需要忽略版本控制中的一系列文件,除了三个特定文件夹中的文件(我们称它们为Folder1,Folder2和Folder3)。我可以将所有需要忽略的文件夹列为一个简单的列表,但我认为这不是一种优雅的方式,所以我编写了以下正则表达式:
.*/(Bin|bin)/(?!Folder1/|Folder2/|Folder3/).*
我的思路如下,从左到右:
- .* - 任意数量的任意字符。
- / - 斜杠符号,用于分隔文件夹。
- (Bin|bin) - 名为"Bin"或"bin"的文件夹。
- / - 斜杠符号,用于分隔文件夹。
- (?!Folder1/|Folder2/|Folder3/) - 文件夹名称不是"Folder1/",也不是"Folder2/",也不是"Folder3/"。这部分最复杂,但我在Google上找到了一些信息。我不明白为什么它会起作用,但在测试时它确实起作用。
- .* - 任意数量的任意字符。
这个表达式在regex101.com上使用一些代表文件路径的文本字符串进行测试时完美地工作,但当我将它放入我的.hgignore文件中时,什么都不起作用,如下所示:
syntax: regexp .*/(Bin|bin)/(?!Folder1/|Folder2/|Folder3/).*
由于某种原因,它忽略了所有"Bin"和"bin"文件夹中的所有文件和子文件夹。我该如何完成我的任务?
附言:据我所知,Mercurial/TortoiseHG使用Python/Perl正则表达式。
非常感谢。
如何从Mercurial/TortoiseHG的.hgignore文件中排除一组文件夹?
问题的出现原因是需要忽略一些文件夹,但同时又需要保留其中的一些文件夹。为了实现这个要求,需要一个正则表达式,可以匹配需要忽略的文件夹,但不匹配需要保留的文件夹。
解决方法是使用以下正则表达式:/[Bb]in/(?!(folder1|2folder|third)/)
。
这个正则表达式可以匹配类似于/bin/somename/...
的字符串中的/bin/
部分,但Mercurial只关注是否匹配,不关注具体匹配的内容。
原始的错误回答中提供了一个错误的正则表达式:/[Bb]in/Folder[123]/
,这个表达式只能匹配类似于/bin/Folder1/
、/bin/Folder2/
和/bin/Folder3/
的字符串,不能满足要求。
同时,回答中还解释了一些相关的概念,如Mercurial只跟踪文件而不跟踪文件夹,文件名匹配忽略模式时文件是否已跟踪的问题等。
需要注意的是,正则表达式的匹配不是自动锚定的,如果需要锚定行为,可以在正则表达式的开头使用^
,在结尾使用$
。在这个问题中,不需要锚定行为,所以可以省略开头和结尾的.*
。
最后,作者提到了自己尝试过使用否定参数来解决问题,但没有成功。他也意识到自己没有清晰地表达出自己的目标,导致回答的方向偏离了问题的要求。建议提供一些示例来明确所需的行为,以避免产生混淆。
作者表示将尝试创建一个样本仓库,供大家测试表达式。