是否可以忽略子目录中的.gitignore规则?


82

我想忽略子目录中的所有.gitignore规则,但根目录中的.gitignore规则除外。

例如)我已经.gitignore在目录结构中归档了/a

并且也有.gitignore文件/a/b。假设/aa.txt b.txt文件。

/a/b.config文件。在中.gitignore定义。.config/a/b

.config文件将被.gitignorein忽略/a/b

但是我真的想.config通过忽略.gitignore子目录中的规则来跟踪文件。

可能吗?

提前致谢

Answers:


134

您的问题不太清楚,但是如果有一些子目录需要不同的gitignore规则,则可以在该目录中创建一个新的.gitignore。

说您有:

项目/.gitignore
项目/材料/.gitignore

stuff /中的.gitignore将覆盖根目录中的.gitignore。

git help gitignoreman gitignore有更多关于可能的信息。


2
我觉得OP是问,如果你有一个目录结构/a/b/c和更新.gitignore/a/b,是否有可能在/a/b/c忽略的规则/a/b,而是只使用规则的/a
Michael Mior 2010年

45
是的,如果这是问题所在,则可以否定.gitignore规则中的规则。"An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again."
signine

3
@signine不适用于目录。看我的回答
罗斯·帕特森

2
我认为这样说比较准确:优先级更高的优先级inner .gitignore将合并outer .gitignore,而不仅仅是优先级。
Eric Wang

@eric wang显然不会合并子目录,但会覆盖:git-scm.com/docs/gitignore
topspin

39

假设您想将其包含node_modules在存储库中,但是下面的某些模块有.gitignore其自己的模块。您可以通过将以下内容添加到根.gitignore文件中来取消规则:

# Make sure to include everything in node_modules.
!node_modules/**

3
有更通用的方法可以做到这一点吗?可以说,我已经有了node_modules/mod1node_modules/mod2里面都是忽略了更深的.gitignorenode_modules里面那些(在node_modules/mod1/node_modules我添加和删除模块常常让我不能很好地认识和手动添加规则,忽略node_modules/mod1/.gitignore或手动添加!node_modules/mod1/node_modules所有的时间。基本上我尝试部署流星应用程序,所有的嵌入式.gitignores技术正在创造一种不可能得到这一切饭桶。
GMAN

10

问题的关键在于排除了父目录。来自$ man gitignore

如果排除了该文件的父目录,则无法重新包含该文件。由于性能原因,Git不会列出被排除的目录,因此所包含文件上的任何模式(无论它们在何处定义)均无效。

这是我如何使其工作的方法。鉴于:

/a/...
/b/foo
/c/...

/.gitignore

/*
!/b

然后/b/foo将显示为包含的文件,而在一切/a/c将被排除在外。折衷方案是您必须为要在其中包含文件的任何目录的所有父项添加一个否定项。


为什么不使用!/b/**/*
亚历克西斯·泰勒

没有您的更多解释就无法回应。
罗斯·帕特森

6

据我所知,这是没有办法的。由于本地.gitignore将覆盖根ginignore,我的解决方法是手动添加。

git add --force [ your file and folder]

子代.gitignore对我不起作用,因为父代会覆盖所有子文件夹设置。如果您强制使用添加git add -f myfile.txt,它将绕过父.gitignore设置开始跟踪更改。
SliverNinja-MSFT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.