Git忽略目录和目录/ *有什么区别?

我很困惑什么是正确的方式来忽略git中的目录的内容。

假设我有以下目录结构:

my_project |--www |--1.txt |--2.txt |--.gitignore 

这个之间有什么区别:

 www 

和这个?

 www/* 

我问这个问题的原因是:在git中,如果一个目录是空的,git将不会在存储库中包含这样的空目录。 所以我试着在目录下添加一个额外的.gitkeep文件,这样它就不会是空的。 当我尝试这个解决scheme时,如果在.gitignore文件中,我写如下:

 www !*.gitkeep 

它不起作用(我的意图是忽略www下的所有内容,但保持目录)。 但是,如果我尝试以下操作:

 www/* !*.gitkeep 

那就行了! 所以我觉得这两种方法肯定有一些区别。

wwwwww/www/*存在差异。

基本上从文档和我自己的testing, wwwfind与文件或目录匹配, www/只匹配一个目录,而www/*匹配目录和www内部的文件。

我只会在这里讨论www/www/*之间的区别,因为wwwwww/的区别是显而易见的。

对于www/ ,git忽略目录www本身,这意味着git甚至不会在里面看。 但是对于www/* ,git会检查www内部的所有文件/文件夹,并忽略模式*所有文件/文件夹。 它似乎导致相同的结果,因为如果所有的子文件/文件夹被忽略,git将不会跟踪一个空文件夹www 。 事实上,对于OP与www/或者www/* standalone的情况来说,结果是没有区别的。 但是,如果与其他规则结合起来,就会产生差异。

例如,如果我们只想包含www/1.txt而忽略所有其他的www呢?

以下.gitignore将不起作用。

 www/ !www/1.txt 

虽然以下.gitignore作品,为什么?

 www/* !www/1.txt 

对于前者,git只是忽略了www目录,甚至不会再看到里面包含www/1.txt 。 第一个规则排除了父目录www而不是www/1.txt ,因此www/1.txt不能被“ 再次包含 ”。

但是对于后者,git首先会忽略www下的所有文件/ folers,然后再包含其中的一个,即www/1.txt

对于这个示例,文档中的以下行可以帮助:

一个可选的前缀“!” 否定了这种模式; 任何先前模式排除的匹配文件将再次包含在内。 如果排除该文件的父目录,则不可能重新包含文件。

我只是parsing通过文档,并据我所知,他们只有不同的更先进的模式,例如

 $ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar 

了上面的testing,如果用!/foo/*replace!/foo ,你确实会得到不同的结果。

注意

 foo 

将排除任何文件foo ,但

 foo/ 

将只排除名为foo的目录。

除了你已经获得的完美的答案,你应该注意,你可以在你的项目中的任何地方有.gitignore ,包括子文件夹。

所以如果你想忽略www里面的所有文件,但是要把www文件夹修改成版本,而不是使用一个空的.gitkeep.dummy或者你select的任何名字,为什么不在那里使用.gitignore ,告诉忽略所有文件?

 / |- .gitignore (a) \- www |- .gitignore (b) |- 1.jpg \- 2.jpg 

在根.gitignore (a)中,你不会说任何有关www文件夹或其内容的东西。

www/.gitignore (二)你把以下内容:

 # ignore all files in this folder except this .gitignore * !.gitignore 

这样一切看起来更有组织(至less对我来说)。

要忽略除dotfiles之外的目录中的所有内容,可以在.gitignore使用以下全局模式:

 www/[^.]* 

因此,不需要额外的.gitignore ,只需简单地将.keep文件添加到您的www目录。