如何在gitignore中编写规则以忽略除某些目录中的目录之外的所有文件?

Dav*_*vid 8 git gitignore

所以我要说我有一个像这样的目录结构

uploads/
--dir1/
----one.txt
----two.txt
----dir2/
------one.txt
------two.txt
Run Code Online (Sandbox Code Playgroud)

我希望跟踪上传的任何目录和子目录,但不能跟踪其中的任何文件,除了虚拟文件,因为git不跟踪目录.

我认为这样的事情会奏效,但事实并非如此.

*
!.gitignore
Run Code Online (Sandbox Code Playgroud)

Chr*_*sen 9

当你告诉它忽略时*,Git不会递归到任何子目录(即使你有一个"unignore"模式可能匹配其中一个目录内的东西).

有一些gitignore模式语言可能会有所帮助.尾部斜杠强制模式仅应用于目录.所以,你应该可以使用这个:

# .gitignore
*
!.keep
!*/
Run Code Online (Sandbox Code Playgroud)

在下面的演示中,我使用上面的内容.gitignoredo-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
Run Code Online (Sandbox Code Playgroud)

这是通过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
Run Code Online (Sandbox Code Playgroud)