gitignore 除了子文件夹中的文件之外的所有文件

gitignore all except file in sub-sub folder

我已经尝试了 .gitignore 的许多组合,但 none 可以满足我的需要。我有这棵树:

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 将不会显示为未跟踪文件,这样人们就可以忘记添加他们。

我已经用**试过了,但还是一样。

有什么想法吗? 谢谢!

question I mentioned in the comments 实际上回答了这个场景;关键部分如下:

If a directory is excluded, Git will never look at the contents of that directory.

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

It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.


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

反过来你必须显式地 unignore 子文件夹,然后 reignore 内容;在此之后,您可以再次 unignore 您的 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 文件以外的所有内容。