除了子文件夹中的一个文件之外,gitignore应该忽略所有内容。

3

我已经尝试过许多.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文件以外的其他文件。我想要提交的只有config.xml文件,并忽略jobs/文件夹中除此之外的所有内容。因此,我尝试了以下方法:

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

这样做会忽略作业内的所有内容,包括config.xml文件。反之亦然。因此,我可以强制添加所有的配置文件并跟踪它们的更改,但如果我在作业中添加一个新文件夹,则其中的config.xml文件不会显示为未跟踪的文件,这样人们就可能忘记添加它们。
我已经尝试使用 **,但结果相同。
有什么想法吗? 谢谢!

1
这个问题有帮助吗?链接 - Sascha Wolf
只是一个随机的猜测:我会在第一行尝试使用/jobs/*/* - Sven Marnach
@Zeeker 不是的,我已经用*替换了第二级文件夹,新的config.xml文件不会显示为未跟踪的文件。 - Rafael Kassner
@SvenMarnach 如果我创建一个新的config.xml文件,它不会显示为未跟踪的文件。 - Rafael Kassner
1个回答

4

我在评论中提到的问题实际上回答了这种情况;关键部分如下:

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

这只是gitignore文档中这段话的改述,重点强调。

如果一个文件的父目录被排除在外,则无法重新包含该文件。 出于性能原因,Git不会列出已排除的目录,因此包含在其中的文件模式没有任何效果,无论它们在何处定义。


您的模式/jobs/*将忽略jobs中的每个文件和文件夹。这意味着git甚至不会查看这些被忽略的文件夹,以查看您的!/jobs/*/config.xml模式是否匹配其中的文件。
因此,您必须明确地取消忽略子文件夹,然后重新忽略内容;之后,您可以再次取消忽略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

这个模式将忽略除了jobs文件夹中一级子文件夹中的config.xml文件之外的所有内容。

我理解了这个概念,从理论上讲你的例子是正确的,但它并不起作用:https://gist.github.com/kassner/27f9ae2013928ee2d381 与git版本有关吗?我正在使用git version 1.9.3 (Apple Git-50) - Rafael Kassner
1
@RafaelKassner 抱歉,我忘了提醒你避免复制注释和尾随空格。它们会影响.gitignore文件。 - Sascha Wolf
这种情况下,空格确实起到了作用。现在它完全按照我的预期工作。非常感谢! - Rafael Kassner
我通常只是在.gitignore的末尾放置!*/,并使用**作为尾部通配符,在!*/之后列出任何实际想要忽略的目录。 jobs/**!jobs/**/config.xml !*/ - jthill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接