当你告诉它忽略*
,Git会不会递归到任何子目录(即使你有一个“屏蔽”模式的可能匹配里面的目录一个东西)。
虽然有一点gitignore模式语言可能有帮助。尾部斜线强制该模式仅适用于目录。所以,你应该能够使用:
# .gitignore
*
!.keep
!*/
在演示下面我用上面的.gitignore
并有一个额外的文件(名为do-not-keep
)并排.keep
文件。您可以看到它适用于多级子目录,并且不显示其他文件。你将不得不通过一些独立的方法安排每个目录拥有自己的.keep
(或其他)。
% git status --short -uall
?? a/.keep
?? a/b/.keep
?? a/b/c/.keep
?? a/b/c/d/.keep
?? e/.keep
?? e/f/.keep
?? e/f/g/.keep
?? h/.keep
?? h/i/.keep
?? j/.keep
这是用Git 1.7.3.1完成的,但我希望它也可以用于其他版本。
演示设置:
% git init
% mkdir -p a/b/c/d e/f/g h/i j
% zargs -i.. -- **/*(/) -- touch ../.keep ../do-not-keep
% tree -aI .git .
.
|-- .gitignore
|-- a
| |-- .keep
| |-- b
| | |-- .keep
| | |-- c
| | | |-- .keep
| | | |-- d
| | | | |-- .keep
| | | | `-- do-not-keep
| | | `-- do-not-keep
| | `-- do-not-keep
| `-- do-not-keep
|-- e
| |-- .keep
| |-- do-not-keep
| `-- f
| |-- .keep
| |-- do-not-keep
| `-- g
| |-- .keep
| `-- do-not-keep
|-- h
| |-- .keep
| |-- do-not-keep
| `-- i
| |-- .keep
| `-- do-not-keep
`-- j
|-- .keep
`-- do-not-keep
10 directories, 21 files
难道你还需要有'在子DIR自己的'.gitignore'文件.gitignore'按顺序列出了忽略文件本身被跟踪Git的? – beporter 2014-05-19 15:13:03
@beporter:我通常只是用'git add -f .gitignore'手动跟踪它(当它被跟踪时,它是否会被忽略并不重要)。但是,如果你不想采取这种一次性的“强制”步骤,那么你可以添加额外的条目(或者,也许更好的话,'!/。gitignore'只会取消第一级'.gitignore')。 – 2014-05-19 17:42:52