| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #!/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
|