有没有办法设置一个 git 子模块,这样它在拉动时不会有分离的头?

Is there a way to set a git submodule so it doesn't have a detached head when pulled?

我们开始使用 git 子模块,我正在尝试为我的开发人员提供一些 chrome。

我知道 git 存储子模块的 SHA,因此它需要提交,这意味着如果开发人员想要更新子模块依赖项,他们通过 CD 进入并获取最新版本,然后提交更改外部目录。

但问题是默认情况下 git 子模块有分离的头。有没有办法在 repo 中配置一个 git 子模块来始终跟踪某个远程分支?以及更改此远程跟踪分支的命令?

我希望能够快速编写 "update my submodule and commit" 脚本,或者快速 "switch my submodule's branch from the dev to a release branch"。我们要切换分支这一事实意味着我不能在任何地方都对分支名称进行硬编码。 git 是否将其存储在合适的位置,或者我是否必须滚动自己的 .submoduleconfig 东西以便我的脚本读取?

我之前搜索过这个,大多数类似的问题是如何让它自动跟踪最新的(git 不支持)以及如何手动 将子模块推送到你给它的特定分支的最新版本,而不仅仅是 "you're already tracking this branch, get latest".

在进一步测试中,我发现问题是 git 对参数排序很挑剔,非常 混淆了这个。

要添加设置为跟随分支的子模块,您必须使用

git submodule add --branch $branchName $remoteURI $modulePath

上面重要的是--branch 不能在结尾。我不知道为什么。

这会创建一个 .gitmodules 文件,其中包含

branch = $branchName

许多其他答案指出了这一点。但他们没有说清楚的是,这与正常的 git 分支跟踪过程 分开 。当你拉下你的子模块时,如果你 CD 进入子模块文件夹,它不会连接到分支,所以它 看起来 就像 branch = dev 失败并且毫无价值。

然而,实际的工作流程是 git 有一个完全不同的机制来更新子模块到最新的分支,如果你使用 branch = $branchName 东西。很混乱。

而不是去

cd $modulePath
git pull

就像几乎每条指令都说,你使用完全不同的命令来更新你的子模块。

git submodule update --remote

(如果您愿意,可以过滤到特定的子模块)。

执行此操作后,您的子模块将位于该分支的 HEAD 但是 如果您 cd 进入 $modulePath,它仍然只会说一个提交哈希而不是分支名称,因为它使用子模块系统而不是正常的 git 跟踪工作流程从外部对其进行操作。