忽略Mercurial中特定文件类型中的一个或多个文件以外的所有文件?

时间:2011-11-10 10:45:51

标签: mercurial hgignore

gitignore: Ignore all files in folder hierarchy except one specific filetype相同的问题,但对于Mercurial。

我希望.hgignore忽略除特定文件类型中的一个或多个文件之外的所有文件,例如,仅允许跟踪*.java*.class文件类型的文件,当前目录以及子目录。

例如,在以下目录中:

A.java
a.txt
a.png
A.class
B/C.java
B/G/H/h.png
B/C.class
D/E/F.java

我只想要包含以下文件(包括目录的结构):

A.java
A.class
B/C.java
B/C.class
D/E/F.java

(如果将创建包含h.png的目录,则无关紧要。)

我尝试过应用和更改上述问题中提到的相同原则(但对于Mercurial而言),以及尝试应用问题How can I ignore all directories except one using .hgignore?中的原则而没有任何运气。

编辑:我在上面提到的目录树

中尝试了以下内容
$ hg stat
? A.class
? A.java
? B/C.class
? B/C.java
? B/G/H/h.png
? D/E/F.java
? a.png
? a.txt
$ hg add -I "**.{class, java}"
adding A.class
adding A.java
adding B/C.class
adding B/C.java
adding D/E/F.java

给了我想要的结果。如何为每个.hgignore-I "**.{class, java}"(以及类似查询)创建应用add的{​​{1}}或配置文件?

2 个答案:

答案 0 :(得分:3)

试试这个:

syntax: regexp
.*\.(?!java$|class$)

或更好:

syntax: regexp
.*\.(?!java$|.*\.java$|class$|.*\.class$)

它也会匹配像“a..java”或“a.java.java”这样奇怪的东西。

编辑:这是一个修订后的解决方案,其中包含了Søren的提示以及我的一些进一步调整。我希望误报,例如像“ajava”或“java”这样的东西没有被忽略,现在已修复。

syntax: regexp
\.(?!java$|class$)[^.]+$
(?<!\.)java$
(?<!\.)class$

答案 1 :(得分:0)

如果忽略模式是可数的,为什么不使用glob模式列表呢?在你的情况下忽略repo-tree中的所有* .class和* .java(如果我理解正确的任务).hgrc将是

syntax: glob

**.class
**.java

如果要忽略所有具有大量(或可能未知)扩展名的文件,除了一些扩展名,您可以尝试在文件定义中使用文件集(hg help filesets)。忽略除了* .png之外的所有扩展名都将是smth。喜欢(TBT!)

"set:not **.png"