pull_submodules.sh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/bin/bash
  2. # 拉取子工程脚本
  3. # 用于初始化并更新 git submodules
  4. set -e
  5. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  6. REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
  7. cd "$REPO_ROOT"
  8. echo "=========================================="
  9. echo " 拉取子工程 (Git Submodules)"
  10. echo "=========================================="
  11. # 检查是否存在 .gitmodules
  12. if [ ! -f .gitmodules ]; then
  13. echo "错误: 未找到 .gitmodules 文件"
  14. exit 1
  15. fi
  16. # 初始化子模块(首次克隆时)
  17. echo ">>> 初始化子模块..."
  18. git submodule init
  19. # 拉取并更新子模块
  20. echo ">>> 拉取子模块..."
  21. git submodule update --init --recursive --remote
  22. echo ""
  23. echo ">>> 为子模块创建/切换到本地跟踪分支..."
  24. # 新增:为每个子模块创建并切换到对应的本地分支
  25. git submodule foreach --recursive '
  26. # 获取 .gitmodules 中为该子模块配置的分支名
  27. branch=$(git config -f "$toplevel/.gitmodules" "submodule.$name.branch")
  28. # 若未配置分支,尝试从远程仓库获取默认分支(通常为 master/main)
  29. if [ -z "$branch" ]; then
  30. # 通过 git ls-remote 获取远程 HEAD 指向的分支
  31. remote_head=$(git ls-remote --symref origin HEAD 2>/dev/null | head -n1 | awk "{print \$2}" | sed "s|refs/heads/||")
  32. branch=${remote_head:-master}
  33. echo " [$name] 未配置 branch,使用默认分支: $branch"
  34. else
  35. echo " [$name] 配置分支: $branch"
  36. fi
  37. # 拉取远程分支最新数据
  38. git fetch origin "$branch"
  39. # 如果本地分支已存在,则直接切换;否则创建跟踪分支
  40. if git show-ref --verify --quiet "refs/heads/$branch"; then
  41. echo " [$name] 本地分支 $branch 已存在,直接切换"
  42. git checkout "$branch"
  43. # 可选:将本地分支重置为远程最新(如需强制同步可取消注释)
  44. # git reset --hard "origin/$branch"
  45. else
  46. echo " [$name] 创建本地分支 $branch 并跟踪 origin/$branch"
  47. git checkout -b "$branch" --track "origin/$branch"
  48. fi
  49. '
  50. echo ""
  51. echo "完成: 所有子工程已拉取完成,并已切换到本地跟踪分支"
  52. echo "子模块列表:"
  53. git submodule status