2010-07-03 167 views
5

我有以下.gitignore文件不忽略子目录中的文件?

*.pyc 

project/app/dist/* 
project/bin/* 
project/etc/* 
project/var/* 

!README.txt 

到目前为止好,我的大部分README.txt文件不会被忽略,就像我希望它除了project/ect/downloads/README.txt发生。该文件被忽略。为什么是这样?我该如何解决这个问题?

如果我没有记错,我可以简单地将它添加到我的项目中手动,但我想了解我在忽略该文件时做了什么不正确的操作。

回答

16

的Git不会搜索project/etc/downloads/任何文件,因为你已经配置它忽略project/etc/*。 “未锚定的”!README.txt模式仅适用于否定排除将要搜索的目录中的条目(即,本身未被排除的目录)。

如果排除project/etc/,Git会永远搜索该目录中,因此否定排除不能适用于它的内容(甚至没有一个如此明确为!project/etc/important-file! - 也许这可以被认为是一个错误?)。

但是,如果排除project/etc/*,Git将搜索该目录,否定排除可应用于其内容。一个人可能会意识到第二种模式将始终匹配所有文件并为这两种模式分配相同的含义,但Git,但Git以不同的方式处理它们。

你可能会认为project/etc/project/etc/*表示同样的事情,但Git以不同的方式对待它们,因为它不会“意识到”第二个匹配目录中的所有内容。

因此,要获得!README.txtprojects/etc/downloads/申请,你将不得不取消忽略了目录,但在!README模式之前忽略它的内容:

project/etc/* 

# "unignore, but ignore the immediate contents of" project/etc/downloads 
# so that subsequent negated patterns can apply to the immediate contents 
!project/etc/downloads/ 
project/etc/downloads/* 

!README.txt 
+0

的排除感谢您的深入响应!我会永远不会猜到unignore-ignore/*方法:) – 2010-07-04 13:14:25

+0

对于ping一个旧帖子的道歉,但在这个问题的三个单独变体上有近十个答案,因此这是我见过的第一个真正令人满意的解决方案。非常感谢! – 2012-08-27 18:45:08

+0

忽略列表必须以'*'结尾。像'public /'这样的东西仍然会忽略下一行中的unignore,它必须是'public/*'。 – 2016-08-11 11:47:07

3

在的.gitignore文件,后/项目的/ etc/*,添加两行:

 
!/project/etc/downloads/ 
/project/etc/downloads/* 
+1

注:这些必须出现在'README.txt'模式为前!它会影响'project/etc/downloads/*' – 2010-07-03 09:03:23