假设我忽略了一个目录,但我想在其中取消签名特定的子目录。所以我有设置:
/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/
但这感觉有点限制和冗长?
答案 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 Lin和John的答案很有帮助,但我需要将两者结合起来。
当要排除其他子文件夹以及上载中的文件时,我发现有必要在给定文件夹之前明确指定任意目录,同时排除文件夹和包括子文件夹
**/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
立即显示在我的源代码控制工具中。