为什么 git checkout 时 git 子模块没有自动更新?
当使用 git checkout 切换分支时,我会假设大多数时候您想要更新子模块。
- 在什么情况下您不想在切换后更新子模块?
- 如果这是通过 git checkout 自动完成的,会出现什么问题?
更新示例:
- 分支 A 在 3852f1 处具有子模块 S
- 分支 B 在 fd72d7 处具有子模块 S
在分支 A 上,git checkout B 将生成分支 B 的工作副本,其子模块 S 在 3852f1 处(带有修改后的 S)。 git 子模块更新将在 fd72d7 处签出 S。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
git checkout --recurse-submodules
已添加到 git 2.13发行说明中提到了这一点:https://github.com/git/git/commit/e1104a5ee539408b 81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139
submodule.recurse< /code> 选项已添加到 git 2.14
设置为:
man git-config
说:我觉得默认情况下不更新模块是一种不好的 Git 默认行为,它违背了大多数用户的期望并限制了子模块的采用,我真的希望开发人员能够改变它。
submodule.recurse
使git fetch
每次都获取所有子模块这使得该选项基本上慢得无法使用,因为即使子模块启动时也会发生获取迄今为止,它尝试从这些子模块获取分支更新。
我做了很多抓取工作来查看同事的提交,所以我必须经常抓取。与顶级存储库相比,子模块的移动速度往往要慢得多,因此没有必要一直获取它们。
所以现在我坚持使用 Bash 函数解决方法:
这个解决方法并不完美,因为还有其他命令可以更改提交,例如 git rebase ,因此您最终必须定义多个别名。我现在没有更好的解决方案:
git checkout --recurse-submodules
was added to git 2.13This is mentioned on the release notes at: https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139
submodule.recurse
option was added to git 2.14Set as:
man git-config
says:I feel that not updating modules by default is a bad Git default behavior that goes against most user's expectations and limits the adoption of submodules, I really wish the devs would change it.
submodule.recurse
makesgit fetch
fetch all submodules every timeThis makes the option basically unusably slow, because the fetch happens even when the submodules are up to date, as it tries to fetch an branch updates from those submodules.
I do a lot of fetching to see my co-workers commits so I have to fetch often. And submodules tend do move much more slowly compared to the toplevel repo, so fetching them all the time is not necessary.
So for now I stick to the Bash function workaround:
This workaround is not perfect as there are other commands that can change commit, e.g.
git rebase
, so you end up having to define multiple aliases. I don't have a better solution for this right now:我认为子模块不自动更新是符合Git的发展目标的。 Git 旨在以分布式模式工作,并且不假定您甚至能够连接到非本地存储库,除非您明确告诉它。当这样想时,Git 不自动刷新子模块将是预期的行为。
话虽这么说,如果您知道您总是希望拉入这些子模块,并且您知道您永远不会将这些子模块分支到另一个本地存储库,那么如果您在之后自动刷新它们,那么它不应该破坏任何东西结帐。
I believe that the submodules not updating automatically is in line with the development goals of Git. Git is meant to work in a distributed mode and doesn't presume that you are even able to connect to a non-local repository unless you explicitly tell it to. Git not auto-refreshing a submodule would be the expected behavior when thought of that way.
With that being said, if you know that you always want those sub-modules to be pulled in and you know that you would never branch off of those submodules to another local repository, then it shouldn't break anything if you automatically refreshed them after a checkout.
在 Git 2.27(2020 年第 2 季度)中,“
--recurse-submodules
”选项得到了更好的记录。请参阅提交 acbfae3、提交 4da9e99, 提交d09bc51,提交b3cec57,提交 dd0cb7d(2020 年 4 月 6 日),作者:达米恩·罗伯特 (
damiens-robert
)。(由 Junio C Hamano --
gitster
-- 合并于 提交 cc908db,2020 年 4 月 28 日)在 Git 2.33(2021 年第 3 季度)中,
submodule.recurse
的文档更加清晰:请参阅 提交 878b399(2021 年 7 月 16 日),作者:Philippe Blain (
phil-blain)
。
(由 Junio C Hamano --
gitster
-- 合并于 提交 c018818,2021 年 8 月 2 日)git config
现在包含在其 手册页:With Git 2.27 (Q2 2020), the "
--recurse-submodules
" option is better documented.See commit acbfae3, commit 4da9e99, commit d09bc51, commit b3cec57, commit dd0cb7d (06 Apr 2020) by Damien Robert (
damiens-robert
).(Merged by Junio C Hamano --
gitster
-- in commit cc908db, 28 Apr 2020)With Git 2.33 (Q3 2021), the documentation for
submodule.recurse
is clearer:See commit 878b399 (16 Jul 2021) by Philippe Blain (
phil-blain
).(Merged by Junio C Hamano --
gitster
-- in commit c018818, 02 Aug 2021)git config
now includes in its man page: