如果您仅将.dummy
文件用作占位符以确保在进行干净签出时始终获得那些特定(几乎为空)的目录,那么您可能应该只排除/var
并使用git add -f var/.dummy var/log/.dummy
来开始显式跟踪占位符文件。有效的结果是您将忽略除.dummy
您明确跟踪的文件之外的所有内容。
另一方面,如果您计划将几乎空目录的层次结构扩展到 just 之外var/log
,那么您可以使用一些解释。
规则在gitignore(5)中描述,但有时很难理解所有规则以及它们如何交互。重要的部分是最后一条规则获胜,而后面的规则只有在它们所作用的目录还没有被完全忽略的情况下才有效。这意味着如果您忽略了目录,则必须先取消忽略它们,然后才能取消忽略它们的一些内容(同时重新忽略它们的其余内容)。
如果您想自动.dummy
忽略除. 我在另一个SO answer中描述了这个解决方案。var
.gitignore
var
# var/.gitignore
*
!/.gitignore
!.dummy
!*/
- 忽略此目录 (
var
) 中的所有内容。
- 但是,不要忽略这个 .gitignore 文件(如果你愿意
git add -f
开始跟踪这个.gitignore
文件,你可以忽略它)。
- 此外,不要忽略
.dummy
以该目录为根的层次结构中任何深度的文件 ( var
)。
- 此外,不要忽略此目录下任何深度的任何目录 (
var
)。
如果没有这条规则,第一条规则将忽略子目录,Git 甚至永远不会打开它们来查找.dummy
文件。
最后两个模式是“递归的”,因为它们没有非尾随斜杠(这意味着*
除了其他字符之外还会匹配斜杠)。尾部斜杠使模式只匹配目录。前导和嵌入的斜线有效地将模式锚定到.gitignore
文件的位置(或其他排除文件中模式的存储库的根)。这个想法是一个普通的*.o
应该匹配任何地方,但dir/*.o
应该只匹配直接在下面的项目dir
(我们可以/*.o
在后面的效果中使用dir/.gitignore
)。
如果你不能容忍一个var/.gitinore
文件,那么你仍然可以按照你的要求做,但是你不能在不编辑排除模式的情况.dummy
下自动“取消忽略”任何地方的新文件。var
# .gitignore at root of repository
/var/*
!/var/.dummy
!/var/log/
/var/log/*
!/var/log/.dummy
- 忽略
var
该文件的同级目录下的所有内容.gitignore
。
- 但是,不要忽视
var/.dummy
.
- 另外,不要忽略目录
var/log
。
- 但是,直接忽略
var/log
.
- 但是,不要忽视
var/log/.dummy
。
模式是:取消忽略一个有趣的目录(第一次跳过这个,因为默认情况下所有内容都是“未忽略的”),忽略目录中的内容,取消忽略其中的.dummy
文件。对层次结构的每个较深部分重复该模式。
您可以替换log
为*
使其适用于 直接位于 下的任何目录var
,但它不会自动适用于更深的目录(例如,它适用于var/cache/.dummy
,但不适用于var/log/ssh/.dummy
)。这是因为我们使用的是非尾随斜线并锚定模式。要手动使其工作,您必须重复该模式以为更深的部分生成更多排除规则(取消忽略有趣的目录,忽略目录的内容,取消忽略文件)。