Shell脚本实现递归更新git模块和子模块

180 阅读1分钟

Shell脚本实现递归更新git模块和子模块

git的子仓库并不总是在最新的main,而是在某个提交,每次更新代码的时候,都要挨个git checkout main,然后再git pull origin main。当子仓库多的时候,一个个去操作会很麻烦。

使用脚本,遍历所有的子仓库,将每一个子仓库,切到main并拉取更新。

脚本如下

#!/bin/bash

# 首先获取所有子模块的路径
submodules=$(git submodule status --recursive | awk '{print $2}')

# 遍历所有子模块
for submodule in $submodules; do
  echo "正在处理子模块:$submodule"
  # 进入子模块目录
  cd "$submodule"
  # 切换到 main 分支
  git checkout main
  # 拉取远程 main 分支的最新更改
  git pull origin main
  # 返回到主仓库目录
  cd ..
  echo "子模块 $submodule 更新完毕。"
done

echo "所有子模块均已更新。"

第二种方法

#!/bin/bash

# 定义一个函数来更新所有 Git 子模块
update_submodules() {
    local main_branch="main"
    local remote_name="origin"

    echo "正在切换到主仓库的 $main_branch 分支..."
    git checkout "$main_branch"

    echo "正在获取所有子模块的路径..."
    # 递归地获取所有子模块的路径
    local submodules=$(git submodule status --recursive | awk '{print $2}')

    # 遍历所有子模块
    for submodule_path in $submodules; do
        echo "正在处理子模块:$submodule_path"
        # 进入子模块目录
        cd "$submodule_path"
        # 切换到 main 分支
        git checkout "$main_branch"
        # 拉取远程 main 分支的最新更改
        git pull "$remote_name" "$main_branch"
        # 返回到主仓库目录
        cd - > /dev/null
        echo "子模块 $submodule_path 更新完毕。"
    done

    echo "所有子模块均已更新。"
}

# 调用函数
update_submodules