我如何在gitignore中编写一个规则来忽略除某个目录中的目录之外的所有文件?

我如何在gitignore中编写一个规则来忽略除某个目录中的目录之外的所有文件?,git,gitignore,Git,Gitignore,假设我有一个这样的目录结构 uploads/ --dir1/ ----one.txt ----two.txt ----dir2/ ------one.txt ------two.txt 我想跟踪上传的任何目录和子目录,但不跟踪其中的任何文件(虚拟文件除外),因为git不跟踪目录 我想这样的办法会管用,但事实并非如此 * !.gitignore 当您告诉它忽略*时,Git将不会递归到任何子目录中(即使您有一个“unignore”模式,该模式可能与其中一个目录中的某些内容相匹配) 不过,有一点模

假设我有一个这样的目录结构

uploads/
--dir1/
----one.txt
----two.txt
----dir2/
------one.txt
------two.txt
我想跟踪上传的任何目录和子目录,但不跟踪其中的任何文件(虚拟文件除外),因为git不跟踪目录

我想这样的办法会管用,但事实并非如此

*
!.gitignore

当您告诉它忽略
*
时,Git将不会递归到任何子目录中(即使您有一个“unignore”模式,该模式可能与其中一个目录中的某些内容相匹配)

不过,有一点模式语言可能会有所帮助。尾随斜杠强制模式仅应用于目录。因此,您应该能够使用:

# .gitignore
*
!.keep
!*/
在下面的演示中,我使用了上面的
.gitignore
,并在每个
.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
这是在Git1.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

你不也需要有
!。gitignore
列在子目录自己的
.gitignore
文件中,以便git跟踪ignore文件本身?@beporter:我通常只会使用
git add-f.gitignore
手动跟踪它(跟踪它时,不管它是否被忽略)。但是,如果您不想采取一次性的“强制”步骤,那么您可以添加额外的条目(或者更好的方法是,
!/.gitignore
,只取消第一级
.gitignore
)。