想象一下以下结构:
/a/1.txt
/a/2.txt
/a/.keep
/a/b/1.txt
/a/b/2.txt
/a/b/3.txt
/a/b/.keep
/a/b/c/1.txt
/a/b/c/2.txt
/a/b/c/3.txt
/a/b/c/4.txt
/a/b/c/.keep
/d/test.txt
/d/work.txt
我想忽略{strong} a
文件中.keep
目录中的所有文件,以获得以下结果:
/a/.keep
/a/b/.keep
/a/b/c/.keep
/d/test.txt
/d/work.txt
我的.gitignore
文件不起作用:
/a/*
!.keep
答案 0 :(得分:2)
不幸的是,根据gitignore Documentation:
,您无法在先前规则忽略的目录中重新包含文件如果排除该文件的父目录,则无法重新包含文件。出于性能原因,Git不会列出排除的目录,因此无论在何处定义文件,所包含文件的任何模式都无效。
所以这个
/a/*
!/a/**/.keep
只会重新包含/a/.keep
而不会重新包含其他内容。
您必须明确排除/a
下的每个文件模式。
/a/**/*.txt
/a/**/.ignore
/a/**/.alsoignore
更新或者更好的解决方案是在.gitgnore
子目录中创建以下/a
:
*.*
!.keep
(唯一的缺点是此解决方案还会保留没有扩展名的文件)
答案 1 :(得分:0)
在您的情况下,您应该使用:
/a/*
!**/.keep
来自gitignore文档:
领先" **"后跟斜杠表示在所有目录中匹配。对于 例如," ** / foo"匹配文件或目录" foo"在任何地方,都一样 作为模式" foo"。 " ** /富/栏"匹配文件或目录" bar" 直接在目录下的任何地方" foo"。