能够在 Git 子模块中更新代码的正确工作流程是什么?

What is the proper workflow for being able to update code within a Git Submodule?

我正在尝试将共享库实现为 Git 子模块,并且我正在努力寻找在子模块文件夹中推送更改的最佳实践。我可以让它工作,但感觉很尴尬。

这是我的测试仓库https://github.com/rupe120/submodule-test

我设置了子模块来跟踪给定的分支,但是在新的克隆和子模块更新后这没有帮助。我知道子模块引用是一个 gitlink,但是当我进入子模块时,我无法推送,因为它引用的“分支”不是分支,而是 gitlink。

我要么需要检出子模块中的跟踪分支,这样我就可以推送更改并在单独的克隆中下拉它们(执行 git pullgit submodule update)。问题是,每当我想在执行子模块更新后更改子模块文件夹中的文件时,我需要先检出跟踪的分支以将其从 gitlink 中取出或使用 git push origin HEAD:<name-of-tracked-branch>[=15 推送=]

当它已经是配置的一部分时,我似乎不需要在我的推送中指定跟踪分支的名称。有什么我想念的吗?

A git clone --recurse-submodules 应该克隆、检出并将两个子模块更新到它们各自远程跟踪分支的最新提交。

但他们仍然会在 SHA1 上进行签出,而不是在分支机构中。

你需要 foreach command to check their branch:

git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo main)'

多行:

git submodule foreach -q --recursive \
  'git switch \
  $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo main)'

OP Josh Russo points out to this gist:

git pull
git submodule update --init --remote
git submodule foreach  -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule $name.branch || echo main)'
git submodule foreach  -q --recursive 'git pull'