忽略 Git 中被忽略目录的子目录

假设我忽略了一个目录,但是我想忽略其中的特定子目录:

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

我想忽略除了 KEEP_ME目录以外的所有内容:

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

但这并不奏效,同一主题的几种排列方式也不奏效。

真正有用的是

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

但是感觉有点限制和冗长?

65172 次浏览

即使向 .gitignore添加了一些内容,也可以使用 力量 git 将其添加到索引中

git add --force uploads/rubbish/stuff/KEEP_ME/

但是,“ KEEP _ ME”似乎是一个目录,git 通常不喜欢空文件夹,所以你应该添加一个“占位符”持有者文件,如果文件夹是空的

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

根据 Gitignore 文档的模式格式部分:

可选的前缀“ !”否定模式; 任何匹配的文件 被以前的模式排除将再次被包含 如果文件的父目录为 Git 没有为性能列出被排除的目录 原因,所以包含的文件上的任何模式都没有效果,无论 在它们被定义的地方。 在第一个前面放一个反斜杠(“”) 例如,对于以“ !”开头的模式, “ ! 重要! . txt”。

因此,先前排除的父目录 /uploads/rubbish/stuff/keep/模式必须在否定其内容之前完全被否定:

#ignore everything within /uploads/
/uploads/*


#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/
!/uploads/rubbish/stuff/keep/*

要在 /uploads/rubbish/stuff/keep/中包含子目录,请添加第三行:

!/uploads/rubbish/stuff/keep/**/*

试图找出在排除具有泛型排除的所有文件夹时如何包含特定文件夹

**/build

如果将 /*添加到泛型排除的末尾,则继续排除所有构建文件 **/build/*

然后添加另一行来更正要包含的路径

!**/folder/build/*

留给我们一个读着

**/build/*
!**/folder/build/*

林和 约翰的答案很有帮助,但我需要把两者结合起来。

当想要排除上传中的其他子文件夹以及文件时,我发现有必要在给定文件夹 同时排除文件夹和包含子文件夹之前显式指定任意目录

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

我还发现有必要显式地重新包含子文件夹及其内容,以显示文件夹和子文件夹中的项目。

作为最受支持的答案提出的解决方案是不正确的,因此很容易证明。

从忽略上传中的所有内容开始/* :

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

现在像上面一样忽略被忽略的内容的父目录:

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

显示没有未追踪的文件。

为了使其正常工作,您需要忽略 uploads/树(uploads/**/*,而不仅仅是顶层 uploads/*)下的所有文件,然后添加您希望保留的树的所有父目录

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

结果是:

On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a

如果我们在上面的 .gitignore中使用了 uploads/*,那么所有的中间文件也将被包含在内,因此例如,uploads/rubbish/a将显示在上面的 status 命令中。

Git 版本2.30.1(Apple Git-130)

对于像我这样的人谁需要取消忽略一种类型的文件,!方法也工作。而且,就像前面提到的 Art Shayderov一样,这个方法仍然列在 git 的官方文档中

因此,我的情况是,dsym文件在我们的 iOS 项目中被完全忽略。但是,我们需要检入一些随 xc 框架附带的必要 dsym文件。这是我的 .gitignore的一部分

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
!*.dSYM

在我添加最后一行并保存文件之后,这些 dsym立即显示在我的源代码控制工具中。