如何让“git不忽略”嵌套文件夹结构中的特定文件扩展名?

8
假设我有这样一个文件夹结构:
├── 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个回答

7
!*/添加到您的.gitignore文件中以允许目录:
*
!*/
!*.c

来自gitignore手册(我强调):

一个可选的前缀“!”可以否定模式;任何被先前模式排除的匹配文件将再次被包含。如果父目录被排除,则不可能重新包含文件。出于性能原因,Git不会列出被排除的目录,因此包含在其中的文件的任何模式都没有效果,无论它们在何处定义。对于以字面“!”开头的模式,请在第一个“!”前加上反斜杠(“\”),例如,“!important!.txt”。

这就是为什么您必须排除目录的原因。


2

来自GITIGNORE(5)

可选前缀“!”,用于否定模式;任何与之前的模式匹配的文件都将重新包含。如果排除了文件所在的父目录,则无法重新包含该文件。

因此,这里发生的情况是/example.c变为未被忽略,但/a/b/d.c仍然被忽略,因为/a/a/b被忽略了。

解决方法是通过在.gitignore中添加以下内容来取消忽略所有目录:

*
!*/
!*.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接