代码之家  ›  专栏  ›  技术社区  ›  Pankaj Singhal

git子模块签出来自各个远程的不同分支的最新提交

  •  1
  • Pankaj Singhal  · 技术社区  · 3 年前

    我的父项目添加了几个子模块。

    出于部署目的,我想签出一个特定的分支,例如 master ,则, staging ,并提取每个子模块中此分支的最新提交。

    我检查了各种答案,如下所示:

    但2022年的最佳实践是什么,这非常令人困惑。我已经 git version 2.30.1 (Apple Git-130)

    到目前为止,我知道这个命令可以用于获取中已经提到的分支的最新提交(从各自的远程) .gitmodules 文件

    git submodule update --remote --merge
    

    但我该如何使用 -b 选项,以便同时切换所有子模块中的分支,以进行差异环境部署?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Pankaj Singhal    3 年前

    我想出了一个适合我的解决方案。

    简单解决方案

    git submodule foreach <command>
    

    上述命令将针对每个子模块运行。

    因此,我运行了以下2个命令来签出所需的分支,并在每个子模块中提取最新的提交

    git submodule foreach git checkout -B staging origin/staging
    git submodule foreach git pull --rebase
    

    复杂的解决方案

    以下命令更新了中的目标分支 .gitmodules 文件

    git config -f .gitmodules submodule.<submodule_path>.branch <target_branch_name>
    

    我使用以下命令对所有子模块进行批量更新

    git submodule status | awk '{ print $2 }' | xargs -I {} git config -f .gitmodules submodule.{}.branch master
    

    然后,以下命令提取(获取和合并)每个子模块各自远程的最新提交

    git submodule update --remote --merge
    

    --merge 备选方案:

    • 省略 -ommitting公司 --合并 将对子模块的远程回购进行硬重置
    • --rebase -这将在远程分支最新提交的子模块上重新确定本地更改的基础