#!/bin/bash # 拉取子工程脚本 # 用于初始化并更新 git submodules set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$REPO_ROOT" echo "==========================================" echo " 拉取子工程 (Git Submodules)" echo "==========================================" # 检查是否存在 .gitmodules if [ ! -f .gitmodules ]; then echo "错误: 未找到 .gitmodules 文件" exit 1 fi # 初始化子模块(首次克隆时) echo ">>> 初始化子模块..." git submodule init # 拉取并更新子模块 echo ">>> 拉取子模块..." git submodule update --init --recursive --remote echo "" echo ">>> 为子模块创建/切换到本地跟踪分支..." # 新增:为每个子模块创建并切换到对应的本地分支 git submodule foreach --recursive ' # 获取 .gitmodules 中为该子模块配置的分支名 branch=$(git config -f "$toplevel/.gitmodules" "submodule.$name.branch") # 若未配置分支,尝试从远程仓库获取默认分支(通常为 master/main) if [ -z "$branch" ]; then # 通过 git ls-remote 获取远程 HEAD 指向的分支 remote_head=$(git ls-remote --symref origin HEAD 2>/dev/null | head -n1 | awk "{print \$2}" | sed "s|refs/heads/||") branch=${remote_head:-master} echo " [$name] 未配置 branch,使用默认分支: $branch" else echo " [$name] 配置分支: $branch" fi # 拉取远程分支最新数据 git fetch origin "$branch" # 如果本地分支已存在,则直接切换;否则创建跟踪分支 if git show-ref --verify --quiet "refs/heads/$branch"; then echo " [$name] 本地分支 $branch 已存在,直接切换" git checkout "$branch" # 可选:将本地分支重置为远程最新(如需强制同步可取消注释) # git reset --hard "origin/$branch" else echo " [$name] 创建本地分支 $branch 并跟踪 origin/$branch" git checkout -b "$branch" --track "origin/$branch" fi ' echo "" echo "完成: 所有子工程已拉取完成,并已切换到本地跟踪分支" echo "子模块列表:" git submodule status