忽略子目录中的gitignore文件

4

这是我的“根目录” .gitignore 的内容

# exclude everything ...
*
# ...except
!/.gitignore
!*/
!/modules/wp-azth/**

问题在于,在modules文件夹下,我有很多带有.gitignore文件的第三方模块。
使用上述规则,所有第三方模块文件夹都被忽略了,但它们的.gitignore文件没有被忽略(当然我不需要它)。
有没有一种方法可以忽略被忽略的子文件夹中的.gitignore文件?也许可以使用.git/config来实现这个目的?
(我认为这是git的一个不好的行为,即使它们被忽略了,它仍然会考虑它们)
更新:似乎是git的缺陷,它允许被忽略的文件夹通过在被忽略的子目录中放置一个.gitignore文件并使用! .gitignore规则来“任意”取消忽略。被忽略的文件夹通常可能包含动态、临时或第三方文件(缓存、temp、插件等),因此git允许使用一个简单的!.gitignore作为规则来创建不需要的行为。 git gui截图

/**/.gitignore怎么样?(我不知道它是否有效,但这是我尝试的方式) - Anthony Raymond
你使用的是哪个版本的git? - VonC
@VonC 我的 Git 版本是 1.9.1。 - Joseph
@Yehonal:https://git-scm.com/docs/git-check-ignore 你需要传递你想要检查的文件。我建议你在一个你不希望看到的文件上运行指定的命令。 - Guildencrantz
git check-ignore -v -n /modules/TC-JSON-API/storage/app/.gitignore 返回结果为:/modules/TC-JSON-API/storage/app/.gitignore:2:!.gitignore /modules/TC-JSON-API/storage/app/.gitignore简而言之,这个文件被自己“重新包含”了... - Joseph
显示剩余3条评论
2个回答

2

* .gitignore会起作用,但是git仍然会跟踪它已经跟踪的.gitignore文件。


两个命令运行之间唯一的区别是,我通过中间命令添加*.gitignore到我的根级别的.gitignore文件。

Showing *.gitignore works


一个可选前缀“!”可以否定模式;任何被先前模式排除的匹配文件将再次包含在内。

来自https://git-scm.com/docs/gitignore

这意味着可能存在一个中间级别的.gitignore文件(s),其中包含! *.gitignore,在某种程度上可能会破坏更高级别的声明。


我刚在Windows上使用Git安装并测试了它,对我来说运行良好。在某个地方创建一个全新的.gitignore文件,然后查看git status是否会显示它,当你在根目录的.gitignore中添加这个时(对我来说不会)。 - mawalker
显然这是设计上的问题,每个子模块都控制其内部跟踪的内容。因此,“父级” .gitignore 仅适用于非模块部分。https://dev59.com/gm435IYBdhLWcg3w7k2b#5127213 那么为什么不通过使用 foreach 添加一个别名,将 '*.gitignore' 添加到所有模块中。(您可能需要删除之前可能存在的每个 gitignore) - mawalker
你误解了,第三方模块不是git子模块,而只是带有源代码的文件夹。然而,在我的“模块”文件夹中,我必须排除除了一些特定文件夹以外的所有内容,就像我说的那样。在第三方项目/文件夹中,有一些.gitignore文件,其中包含! .gitignore规则,似乎影响整个存储库。由于其他第三方文件夹的内容不受我控制,因此我无法更改这些gitignore文件。 - Joseph
无论你是否拥有源代码,如果你“有”源代码,你就可以编辑它/摆脱那些规则(“允许”显然/不幸是另一回事)。如果你“有”源代码但实际上并没有开发它,那么你应该将它们放在子模块中(这就是它们的设计目的),不这样做只会引发问题(就像你正在经历的问题一样)。我不确定.gitignore的反向规则是后缀/前缀/中缀/全局/子文件夹等。如果你把它们放在子模块中,它们就会是自包含的,不会打扰你的主repo。 - mawalker
似乎缺少git,它允许被忽略的文件夹“任意”取消忽略。被忽略的文件夹通常可能包含动态、临时或第三方文件(缓存、临时文件、插件等)...因此,git允许通过在.gitignore文件中使用简单的!来创建不需要的行为。 - Joseph
显示剩余3条评论

1
问题在于位于/modules目录中的.gitignore文件:

git check-ignore -v -n /modules/TC-JSON-API/storage/app/.gitignore返回:/modules/TC-JSON-API/storage/app/.gitignore:2:!.gitignore /modules/TC-JSON-API/storage/app/.gitignore

因此,解决方法就是将/modules/*添加到我的.gitignore文件中:
# exclude everything ...
*
# ...except
!/.gitignore
!*/
!/modules/wp-azth/**

变成
# exclude everything ...
*
modules/*
# ...except
!/.gitignore
!*/
!/modules/wp-azth/**

我不理解为什么git需要这种“规范”...没有这个规则,只有被忽略文件夹的.gitignore文件才会在提交时被处理/列出。但现在它可以工作了。

1
这是因为你排除了所有带有 * 的文件,然后包含了所有带有 !*/ 的目录。任何一个被包含的目录中的 .gitignore 文件都将被处理。通过明确声明要排除 modules/*,你不再包含 /modules/TC-JSON-API/storage/app/ 目录,所以 git 不会再包含 /modules/TC-JSON-API/storage/app/.gitignore - Guildencrantz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接