Git忽略目录和目录/ *有什么区别?
我很困惑什么是正确的方式来忽略git中的目录的内容。
假设我有以下目录结构:
my_project |--www |--1.txt |--2.txt |--.gitignore
这个之间有什么区别:
www
和这个?
www/*
我问这个问题的原因是:在git中,如果一个目录是空的,git将不会在存储库中包含这样的空目录。 所以我试着在目录下添加一个额外的.gitkeep文件,这样它就不会是空的。 当我尝试这个解决scheme时,如果在.gitignore文件中,我写如下:
www !*.gitkeep
它不起作用(我的意图是忽略www下的所有内容,但保持目录)。 但是,如果我尝试以下操作:
www/* !*.gitkeep
那就行了! 所以我觉得这两种方法肯定有一些区别。
www
, www/
和www/*
存在差异。
基本上从文档和我自己的testing, www
find与文件或目录匹配, www/
只匹配一个目录,而www/*
匹配目录和www
内部的文件。
我只会在这里讨论www/
和www/*
之间的区别,因为www
和www/
的区别是显而易见的。
对于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
目录。