更改现有子模块的分支

Bri*_*n D 3 git git-submodules

最初添加子模块时,我指定了一个特定的分支,如.gitmodule文件所示:

[submodule "externals/grpc/grpc"]
    path = externals/grpc/grpc
    url = git@github.com:me/grpc.git
    branch = release-1.0
Run Code Online (Sandbox Code Playgroud)

我想更改为我的子模块的master分支,所以我将分支.gitmodules从更改release-1.0master,并且很好地,只是从父git树中删除了该子模块:

cd $submodules
rm -rf grpc
cd $gitroot
git submodule sync
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

现在,当我返回子模块时,它仍然是从release-1.0分支上的提交而不是最新的主提交中检出的。

我缺少什么步骤来切换子模块的分支?

wor*_*cle 31

自 v2.22(2019 年第 3 季度)起(感谢评论中的 @VonC)

假设你有子模块xyz.gitmodules看起来像

$ cat .gitmodules
[submodule "xyz"]
        path = xyz
        url = git@git.com:xyz.git
        branch = main
Run Code Online (Sandbox Code Playgroud)

你可以用以下命令检查它

$ git config --file=.gitmodules -l
submodule.xyz.path=xyz
submodule.xyz.url=git@git.com:xyz.git
submodule.xyz.branch=main
Run Code Online (Sandbox Code Playgroud)

现在你想引用分支v1.0.0xyz你可以运行

git submodule set-branch -b v1.0.0 xyz
Run Code Online (Sandbox Code Playgroud)

然后运行全新更新

git submodule sync
git submodule update --init --recursive --remote
Run Code Online (Sandbox Code Playgroud)


use*_*598 8

上面的答案(@milgner)对我不起作用(git版本2.17.0)。也许我做错了什么。

以下是对我有用的:

nano .gitmodules # substitute the needed branch here
git submodule update submodule_name # update the submodule
git add .gitmodules && git commit -m 'some comment' # add and commit
git submodule status # check that changes have been applied
Run Code Online (Sandbox Code Playgroud)


Ser*_*rgO 8

如果您想切换到以前从未跟踪过的分支。

更改 中的分支后.gitmodules,请执行以下操作:

git submodule update --init --recursive --remote
cd submodule_name
git checkout new_branch_name
Run Code Online (Sandbox Code Playgroud)

  • 对我来说第一行(git update)就足够了 (3认同)

mil*_*ner 5

进入子模块所在的目录以及git checkout正确的分支/提交。然后,再向上一个级别,并git addgit commit目录。这将使用正确的提交检入子模块。

并且不要忘记git submodule update --recursive在更新其他客户端后在它们上运行。

  • 有趣的是,虽然 git 仍然指向正确的提交(在分支中),但“.gitmodules”文件不包含分支字段。尽管如此,它似乎仍然有效。 (3认同)