我如何在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
)。