让“git commit -a”忽略子模块?

让“git commit -a”忽略子模块?

的行为git commit -a似乎是包含对子模块的更改(如果它们里面有新的提交)。这通常不是我想要的,有时我发现自己会意外地推送一个包含我本不打算包含的子模块更改的提交。

有没有办法设置git commit -a忽略子模块?我看了一下git help config,什么也没看到。

一个(不太好的)替代方案可能是让用户git status一眼就能看清楚是否git commit -a包含子模块。目前它显示

modified:   submodule (modified content)

或者

modified:   submodule (new commits)

并且它们非常相似。看起来submodule.<name>.ignore配置选项可以做我想要的事情。但理想情况下,我仍然希望看到对子模块的更改,只是不要与我所有其他更改位于同一位置,除非git commit -a添加它们。

答案1

您可以在 git 配置或 .gitmodules 文件中设置 submodule.ignore。

注意:GIT 在这方面有点愚蠢。如果您设置 ignore = all,为了使用 git commit -a 获得合理行为,当您明确添加子模块时,它也会忽略 git show/diff 中的子模块。解决后者的唯一方法是使用命令行选项 --ignore-submodule=none。

注2:diff.ignoreSubmodules 配置应该能够设置默认命令行选项 --ignore-submodule,但已被破坏多年,并且由于 .gitmodules 赢得了竞争而没有任何作用,所以只有明确的命令行选项才能让你得到合理的行为。

答案2

如果你没有大量的子模块,我发现最方便的方法是先提交所有,然后运行

git 重置 HEAD^1 子模块路径

如果您不做任何更改就运行 git commit --amend,您始终可以获得此命令语法的提醒。它将显示在注释说明的顶部附近。

相关内容