首页 > 解决方案 > 使用 --remote 参数更新子模块,一些跟踪分支,一些不跟踪分支

问题描述

有没有办法做类似的事情:

git submodule update --remote

在包含多个不跟踪分支的子模块的存储库上?我只希望真正跟踪分支的一个更新,而另一个不做任何事情(或像往常一样更新到目标 sha1)。现在,当 git 尝试更新不跟踪任何内容的子模块时,我收到此错误:

fatal: Needed a single revision
Unable to find current origin/master revision in submodule path 'modules/mod4'

我猜“--remote”参数会导致 git 尝试签出一个分支,但是那里出了点问题,因为我的 .gitmodule 条目中没有设置“分支”。我将在我的问题上抛出一堆脚本,但也许只有我没有看到的 git 有一个优雅的解决方案?

这是一个输出示例:

> git submodule update --remote --force
Submodule path 'modules/mod1': checked out 'bebbe6721007f06765ec1cd7cb9f1bf6ac654c33'
Submodule path 'modules/mod2': checked out '3b4c9dadfa432fd6fdd400695770f6cb50f7fb17'
Submodule path 'modules/mod3': checked out 'c619954bad6673abd44eac520d43b448168ca196'
Submodule path 'modules/mod5': checked out '5f64331aab836218a86fc3640f91ab029b4e1890'
fatal: Needed a single revision
Unable to find current origin/master revision in submodule path 'modules/mod4'

和我的 .gitmodules 供参考:

[submodule "modules/mod1"]
    path = modules/mod1
    url = ssh://git@stash.sd.repo.com/mod1.git
    branch = develop
[submodule "modules/mod2"]
    path = modules/mod2
    url = ssh://git@stash.sd.repo.com/mod2.git
    branch = develop
[submodule "modules/mod3"]
    path = modules/mod3
    url = ssh://git@stash.sd.repo.com/mod3.git
    branch = develop
[submodule "modules/mod4"]
    path = modules/mod4
    url = ssh://git@stash.sd.repo.com/mod4.git
[submodule "modules/mod5"]
    path = modules/mod5
    url = ssh://git@stash.sd.repo.com/mod5.git
    branch = develop
[submodule "modules/mod6"]
    path = modules/mod6
    url = ssh://git@stash.sd.repo.com/mod6.git
    branch = develop
[submodule "modules/mod7"]
    path = modules/mod7
    url = ssh://git@stash.sd.repo.com/mod7.git

非常感谢您的帮助。

标签: gitgit-submodules

解决方案


--remote选项只是指示在子模块中运行git submodule update执行其操作,使用一些远程跟踪名称:git fetch

      --remote
此选项仅对更新命令有效。不要使用超级项目记录的 SHA-1 来更新子模块,而是使用子模块的远程跟踪分支的状态。使用的遥控器是分支的遥控器 ( branch.<name>.remote),默认为origin. 使用的远程分支默认为master但可以通过设置submodule.<name>.branch选项.gitmodules.git/config.git/config优先)来覆盖分支名称。

...

为了确保当前跟踪分支状态,update --remote[在子模块中运行git fetch]。

还有更多; 仔细阅读文档git submodule请注意我在上面加粗的部分。

这意味着您的问题不一定是分支设置或缺少分支设置:git submodule update命令默认为master.

因此,这:

fatal: Needed a single revision
Unable to find current origin/master revision in submodule path 'modules/mod4'

表示运行后git fetch,就没有了origin/master

除此之外,我们什么都不知道。但是,您可以了解更多信息。例如,也许有一个更新origin/main:也许负责这个特定存储库的人重命名mastermain. 如果是这样,所有引用此子模块的超级项目都应该添加一个分支指令,以便master覆盖默认值。

假设您可以控制您的超级项目,您可以自己执行此操作。如果没有,您可以使用.git/config技巧:请参阅“优先”括号中的注释。


推荐阅读