2010-10-06 62 views

回答

7

当你告诉它忽略*,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 
+0

难道你还需要有'在子DIR自己的'.gitignore'文件.gitignore'按顺序列出了忽略文件本身被跟踪Git的? – beporter 2014-05-19 15:13:03

+0

@beporter:我通常只是用'git add -f .gitignore'手动跟踪它(当它被跟踪时,它是否会被忽略并不重要)。但是,如果你不想采取这种一次性的“强制”步骤,那么你可以添加额外的条目(或者,也许更好的话,'!/。gitignore'只会取消第一级'.gitignore')。 – 2014-05-19 17:42:52

相关问题