忽略除一个文件之外的子目录中的所有文件和文件

时间:2014-09-06 13:05:36

标签: gitignore

想象一下以下结构:

/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

2 个答案:

答案 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"。