在Git中忽略目录的Unignore子目录

时间:2011-03-10 15:35:17

标签: git gitignore

假设我忽略了一个目录,但我想在其中取消签名特定的子目录。所以我有设置:

/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/

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

6 个答案:

答案 0 :(得分:92)

根据pattern format section of the gitignore documentation

  

可选前缀“!”否定了这种模式;任何匹配的文件   被先前模式排除的将被再次包括在内。 不是   如果该文件的父目录是,则可以重新包含文件   排除。 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/**/*

答案 1 :(得分:26)

即使您向.gitignore添加内容,也可以强制 git将其添加到索引

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

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

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

答案 2 :(得分:5)

在使用通用排除

排除所有文件夹时,试图弄清楚如何包含特定文件夹
**/build

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

然后添加另一行以更正您想要包含的路径

!**/folder/build/* 

给我们留下一个读取的gitignore

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

答案 3 :(得分:5)

提出最多答案的解决方案是不正确的,因此很容易证明。

首先忽略上载中的所有内容/ *:

find(T &&val)

现在,如上所述,请忽略被忽略内容的父目录:

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 中使用过uploads/*,那么所有中间文件也将被包括在内,例如.gitignore将显示在上面的status命令中。

答案 4 :(得分:0)

Buo-Ren LinJohn的答案很有帮助,但我需要将两者结合起来。

当要排除其他子文件夹以及上载中的文件时,我发现有必要在给定文件夹之前明确指定任意目录,同时排除文件夹和包括子文件夹

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

我还发现有必要明确地重新包含子文件夹及其注释,以显示文件夹和子文件夹中的所有项目。

答案 5 :(得分:0)

git 版本 2.30.1 (Apple Git-130)

对于像我这样需要取消忽略一种类型文件的人来说,! 方法也适用。另外,像 Art Shayderov 提到的,这个方法仍然列在 git 的官方文档中

所以我的情况是 dsym 文件被我们的 iOS 项目完全忽略了。但是,我们需要检入 xcframeworks 附带的一些必要的 dsym 文件。这是我的 .gitignore

的一部分
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
!*.dSYM

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