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

Git中被忽略目录的Unignore子目录,git,gitignore,Git,Gitignore,假设我忽略了一个目录,但我想取消其中特定的子目录。因此,我有以下设置: /uploads/ /uploads/rubbish/ /uploads/rubbish/stuff/KEEP_ME/ /uploads/foo/ /uploads/foo/bar/lose/ 我想忽略所有内容,但不包括KEEP\u ME目录。我希望“忽略”看起来像: /uploads/* !/uploads/rubbish/stuff/KEEP_ME/ 但这是行不通的,同一主题上的几个排列也是行不通的 能起作用的是 /

假设我忽略了一个目录,但我想取消其中特定的子目录。因此,我有以下设置:

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
我想忽略所有内容,但不包括
KEEP\u ME
目录。我希望“忽略”看起来像:

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
但这是行不通的,同一主题上的几个排列也是行不通的

能起作用的是

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

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

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

git add --force uploads/rubbish/stuff/KEEP_ME/
然而,“KEEP_ME”似乎是一个目录,git通常不喜欢空文件夹,所以如果文件夹是空的,您应该添加一个“占位符”持有者文件

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me
根据:

可选前缀“!”否定模式;任何匹配的文件 被先前模式排除的将再次被包括<不是 如果文件的父目录为空,则可以重新包含该文件 排除。Git没有列出性能排除的目录 原因,所以包含的文件上的任何模式都不会产生任何影响 定义它们的位置。在第一个字符前面加一个反斜杠(\) “!”例如,对于以文字“!”开头的模式, “!重要!.txt”

因此,之前排除的父目录
/uploads/垃圾/stuff/keep/
模式必须在否定其内容之前以独占方式否定:

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*
要在
/uploads/垃圾/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
不显示未跟踪的文件

为了让它工作,您需要忽略
上传/
树下的所有文件(
上传/***
,而不仅仅是顶层,
上传/*
),然后添加要保留的树的所有父目录

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
分支主机上的

...
未跟踪的文件:
(使用“git add…”包含在将提交的内容中)
上传/垃圾/东西/留下来/a
如果我们在上面的
.gitignore
中使用了
uploads/*
,那么所有的中间文件都会被包括在内,因此,例如
uploads/falk/a
将显示在上面的status命令中。

git版本2.30.1(Apple git-130)

对于像我这样需要取消一种文件类型的人,
方法也可以工作。同样,正如前面提到的,这个方法仍然列在git的官方文档中

因此,我的情况是,
dsym
文件在我们的iOS项目中被完全忽略。然而,我们需要签入xcframeworks附带的一些必要的
dsym
文件。这是我的
.gitignore

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

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

唯一的问题是,这个特定示例引用了一个我应该提到的全局gitignore。我知道我可以强制添加项目,但如果添加了任何新项目,我将不得不这样做,并且在最初为每个新存储库添加项目。是否保留。确保内容不被忽略?进行了一点测试。是的,您必须对
KEEP_ME
中的每个新项目或文件夹使用
git add--force
。但在那之后,只需添加更新(例如,当执行
git add-u
时),就好像文件是“未识别的”。
.keep__me
没有任何作用,它只是一个文件,git可以对文件夹进行操作。
git add--force
是错误的解决方案。如果您移动一个目录或将文件移动到另一个目录,git的跟踪将删除该文件,但不会将其添加到新位置,您必须再次执行
git add--force
。通过取消对通用模式的忽略,git将跟踪repo中文件的移动。这是唯一对我有效的解决方案。我的文件夹没有被忽略,但我无法以任何方式添加它。这样我就解决了。你用的是什么版本的git?也许这只是某些版本的东西。不好意思。我忘了我贴了这条评论。不过我让它工作了。FWIW,我不使用前导斜杠。我不记得这是否是问题所在。我使用的是1.7.2.5。我有一个全局gitignore文件,其中我忽略了所有的*.zip文件。但是对于一个特定的项目,我希望包含zip文件。我将这一行添加到该项目的
.gitignore
,效果非常好<代码>!*。zip
我发现有必要明确指定给定文件夹前后的任意目录,同时排除文件夹和包含子文件夹。()。此方法不起作用(从git 2.25开始——可能git中的某些内容发生了更改)。我在下面发布了更正。您提供的代码不适合我(使用git版本1.9.1)。一个有效的方法是/uploads/*/上传/垃圾//上传/垃圾/*/上传/垃圾/东西/上传/rubb