我已经尝试过.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将不会显示为未跟踪的文件,因此人们可能忘记添加它们。
我已经尝试过**,但我也一样。
有什么想法吗? 谢谢!
答案 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
个文件以外的所有文件。