如何在嵌套文件夹结构中使'git not ignore'某些文件扩展名?

时间:2014-10-20 15:37:51

标签: git

假设我有这样的文件夹结构:

├── a
│   ├── b
│   │   ├── c.xml
│   │   └── d.c
│   ├── v
│       ├── e.class
│       └── g.c
|
├── m
│   ├── p
│   │   ├── w.out
│   │   └── x.c
│   ├── q
│   │   ├── y.mp3
│   │   └── z.c

我只想不要忽视*.c

我试过

*                                                                         
!*.c 
.gitignore中的

,但这似乎只适用于当前级别。

我想要的是设置!*/*/*.c之类的东西,因为稍后可能会有其他目录添加到git repo中,我无法对.gitignore文件进行硬编码。

2 个答案:

答案 0 :(得分:5)

!*/添加到.gitignore以允许目录:

*
!*/
!*.c

来自gitignore man page(强调我的):

  

可选前缀"!"否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。 如果排除该文件的父目录,则无法重新包含文件。由于性能原因,Git不会列出排除的目录,因此所包含文件的任何模式都不起作用,无论他们在哪里定义。在第一个"!"前面放一个反斜杠(" \")对于以文字"!"开头的模式,例如"!important!.txt"。

这就是你必须排除目录的原因。

答案 1 :(得分:1)

来自GITIGNORE(5)

  

可选前缀"!"否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含文件。

所以这里发生的事情是/example.c变得不合情理,但/a/b/d.c仍被忽略,因为忽略了/a/a/b

解决方案是通过将所有目录放入.gitignore

来取消所有目录
*
!*/
!*.c