【问题标题】:Git: Recursively switching branch (checkout) on all submodulesGit:在所有子模块上递归切换分支(结帐)
【发布时间】:2018-05-29 19:07:48
【问题描述】:

我正在开发一个包含 submodules 的 git 存储库。我在所有子模块(包括父模块)中都有同名的分支(如masterdevelopment..),它们都跟踪相应的远程分支。

我希望一次在所有子模块中签出相同的分支。换句话说,我想要的是,如果我在父模块中切换到development分支,所有子模块也应该切换到development分支,这样我的工作树才能与分支保持一致。

手动执行此操作是痛苦且重复的。有捷径吗?

【问题讨论】:

  • git submodule update 无论如何都会更新它们(到分离的 HEAD)。你打算如何利用现有的分支?
  • @max630 你是对的。只是在我的团队中,我们通常不使用git submodule update。相反,我们使用git pull --rebase origin master --recurse-submodules,这样每个submodule 都得到rebased 和master(不管branch 当前在submodules 中签出)。我承认这适用于我的孤立用例,大多数人可能不需要

标签: git git-submodules git-alias


【解决方案1】:

我在git-aliasbash script 的帮助下实现了这一目标。

以下是我的名为 git-rcheckout.sh 的 bash 脚本,取自 @qbein's answer

#!/bin/bash
((!$#)) && echo No branch name, command ignored! && exit 1
git checkout $1 && git submodule foreach --recursive git checkout $1

接下来我将此脚本别名为 rcheckout 命令为 told by @u0b34a0f6ae

git config --global alias.rcheckout '!sh ~/path/to/script/git-rcheckout.sh'

问题: 目前,它仅在您从父模块执行 git rcheckout branch-name 时才有效。您可能也可以更新 bash 脚本以从子模块中执行此操作,但我太懒了。所以欢迎提出建议。

【讨论】:

    【解决方案2】:

    您可以使用--recurse-submodule 标志。例如:git checkout master --recurse-submodules

    使用 --recurse-submodules 会根据超级项目中记录的提交更新所有初始化子模块的内容。 [https://git-scm.com/docs/git-checkout#git-checkout---no-recurse-submodules]

    【讨论】:

    • 你也可以这样pull,不知道还有什么可能?? git pull --recurse-submodules
    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 2022-01-20
    • 2013-07-21
    • 2018-11-18
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多