我们开始使用git子模块,我正在尝试为我的开发人员提供一些镶边。
我知道git会存储子模块的SHA,因此它需要提交,因此这意味着如果开发人员想要更新子模块的依赖关系,则可以通过CD更新并获取最新信息,然后在外部目录中提交更改来进行。
但是问题是默认情况下git子模块具有分离的头。有没有办法在仓库中配置git子模块以始终跟踪某个远程分支?以及用于更改此远程跟踪分支的命令?
我希望能够编写一个快速的“更新我的子模块并提交”脚本,或者快速编写“将我的子模块的分支从dev切换到release分支”。我们要切换分支的事实意味着我不能只是在各处硬编码分支名称。 git是否将其存储在适当的位置,还是我必须滚动自己的.submoduleconfig以便脚本读取?
我之前已经搜索过这个问题,大多数类似的问题是如何使其自动跟踪最新(git不支持)以及如何手动将子模块推到最新的您为其指定的特定分支,而不仅仅是“您已经在跟踪该分支,获取最新信息”。
答案 0 :(得分:0)
在进一步的测试中,我发现问题在于git对参数的排序很挑剔,并且非常令人困惑。
要添加设置为跟随分支的子模块,必须使用
git submodule add --branch $branchName $remoteURI $modulePath
上面重要的事情是--branch不能在 end 处。我不知道为什么。
这将创建一个.gitmodules文件,其中包括
branch = $branchName
许多其他答案指出。但是他们不清楚的是,这与正常的git分支跟踪过程是分开的。当您拉下子模块时,如果您将CD放入子模块文件夹中,则该子模块将不会连接至分支,因此它看起来像branch = dev
失败了,毫无价值。
但是,实际的工作流程是,如果您使用branch = $branchName
,则git具有完全不同的机制来将子模块沿其分支更新为最新。非常令人困惑。
代替前进
cd $modulePath
git pull
就像几乎每条指令所说的一样,您使用完全不同的命令来更新子模块。
git submodule update --remote
(如果需要,可以将其过滤到特定的子模块)。
执行完此操作后,子模块将位于该分支的HEAD ,但是如果您进入$ modulePath,它仍会说只是一个提交哈希而不是分支名称,因为它正在处理这是从外部使用子模块系统,而不是正常的git跟踪工作流程。