我具有以下文件夹结构:
/foo/ /foo/test.txt /foo/.gitkeep /foo/bar/test.txt /foo/bar/.gitkeep /foo/bar/baz/test.txt /foo/bar/baz/.gitkeep
现在,我想排除“ foo”文件夹中的所有文件及其子文件夹(和子子文件夹)中的所有文件,但不包括所有.gitkeeps(以便保留文件夹结构)。这也应该适用于3个以上级别的子文件夹。
以下gitignore-rules起作用:
/foo/** !/foo/**/ !/foo/**/.gitkeep
有人可以解释一下,这为什么起作用吗?有没有更干净的方法可以做到这一点?
规则很简单:
如果排除该文件的父目录,则无法重新包含该文件。
这就是为什么你需要
递归地忽略文件和文件夹:
/foo/**
(如果只忽略/foo/
,即文件夹,那么将不使用任何数量的“ !
”排除规则,因为foo/
文件夹本身将被忽略:Git将在此处停止)
然后从忽略规则中排除文件夹:
!/foo/**/
在将文件列入白名单之前.gitkeep
!/foo/**/.gitkeep
这.gitkeep
是可行的,因为父文件夹已从忽略规则中排除。
与伯纳多(Bernardo)的原始建议相反(在他编辑之前):
/foo/** !**/.gitkeep
如果没有从/**
忽略规则中排除文件夹,则文件的排除规则无效。
您可以使用以下方法进行检查:
git check-ignore -v -- /path/to/.gitkeep
如scm中所述.gitignore
:
使用“ *
”与“ **
” 相同
使用!.gitkeep
(不带/锚)将递归排除该文件。
在这两种情况下,“ recursively
”是解释为什么可以应用排除规则的关键术语:如果忽略文件夹(如.
或/foo/
),则将无法排除该文件夹中的任何内容。
但是,如果您递归地(*
或**
)忽略元素(文件和文件夹),并从gitignore规则中排除文件夹(再次通过递归规则!*
),则可以排除(白名单)文件。