不要忽略子目录中的文件?

时间:2010-07-03 02:53:22

标签: git

我有以下.gitignore文件

*.pyc

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

!README.txt

到目前为止,我的大多数README.txt文件都没有被忽略,就像我希望它发生一样,除了project/ect/downloads/README.txt。那个文件被忽略了。为什么是这样?我该如何解决这个问题?

如果我没记错的话,我可以手动将它添加到我的项目中,但是我想知道我在忽略文件时做错了什么。

2 个答案:

答案 0 :(得分:16)

Git不会搜索project/etc/downloads/任何文件,因为您已将其配置为忽略project/etc/*。 “unanchored”!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

答案 1 :(得分:3)

在.gitignore文件中,在/ project / etc / *之后添加2行:

!/project/etc/downloads/
/project/etc/downloads/*