gitignore除子文件夹中的文件外

时间:2015-03-12 12:57:43

标签: git gitignore

我已经尝试过.gitignore的许多组合,但没有一个能够满足我的需要。我有这棵树:

jobs/
jobs/projecta/config.xml
jobs/projecta/garbage
jobs/projecta/more/garbage
jobs/projectb/config.xml
jobs/projectb/garbage
jobs/projectb/more/garbage

垃圾意味着任何其他文件。我想只提交config.xml文件,并忽略jobs /除了它们之外的所有内容。所以我试过了:

/jobs/*
!/jobs/*/config.xml

这样,作业内的所有内容都会被忽略,包括config.xml文件。使用相反的顺序,同样的情况发生。所以,我可以强制添加所有配置文件并对它们进行更改,但是如果我在作业中添加一个新文件夹,它的config.xml将不会显示为未跟踪的文件,因此人们可能忘记添加它们。

我已经尝试过**,但我也一样。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

question I mentioned in the comments实际上回答了这种情况;关键部分如下:

  

如果排除目录,Git将永远不会查看该目录的内容。

这只是对gitignore文档中此片段的重新修改,重点是我的。

  

如果排除该文件的父目录,则无法重新包含文件。 Git不会出于性能原因列出排除的目录,因此无论在何处定义文件,所包含文件的任何模式都无效。


您的模式/jobs/*将忽略jobs中的每个文件和文件夹。这意味着git甚至不会查看这个被忽略的文件夹,看看你的!/jobs/*/config.xml模式是否与其中的文件匹配。

反过来,你必须明确 unignore 子文件夹,然后 reignore 内容;在此之后,您可以再次取消标记您的config.xml文件。这可能看起来很愚蠢,但这就是git处理忽略的方式。

# Ignore everything in /jobs
/jobs/*
# Reinclude all folders in /jobs
!/jobs/*/
# Ignore everything in the subfolders of /jobs
/jobs/*/*
# Reinclude config.xml files in the first-level subfolders of /jobs
!/jobs/*/config.xml

此模式将忽略config.xml的第一级子文件夹中除jobs个文件以外的所有文件。