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