.gitignore中的否定模式如何工作?

我正在尝试使用带有否定模式的.gitignore文件(以!开头的行),但是它不能按我期望的方式工作。

作为一个简单的例子,我有以下的目录结构:

C:/gittest -- .gitignore -- aaa/ -- bbb/ -- file.txt -- ccc/ -- otherfile.txt 

在我的gitignore文件中,我有这样的:

 aaa/ !aaa/ccc/ 

我的理解(基于这个文档页面 )是文件aaa / ccc / otherfile.txt不应该被忽略,但实际上git是忽略aaa下的一切。

我误解了这句话:“一个可选的前缀!否定模式;任何先前模式排除的匹配文件将再次被包含”。

顺便说一句,这是在Windows上使用msysgit 1.7.0.2。

我认为你真正想要做的是:

 aaa/* !aaa/ccc 

你告诉它“不要看aaa ”,所以它甚至不检查pathaaa/ccc 。 如果使用通配符,它​​仍会读取aaa的内容,那么每个条目都与通配符匹配,并被忽略,除了被重新放回的aaa/ccc

如果您想排除aaa所有内容,但是包含aaa/ccc及其下的所有内容,则应该使用:

 aaa/* !aaa/ccc !aaa/ccc/* 

第一行告诉git在aaa下忽略everthing,第二行告诉它不要忽略文件夹aaa/ccc ,它实际上“启用”了第三行,然后告诉它不要忽略aaa/ccc下面的所有内容。

如果任何人仍然没有看到新的未被忽略的项目在运行git update-indexgit status之前可以帮助git查看更改(至less在gitbash版本1.9.x中)。