蒙蒙plus
蒙蒙plus
Published on 2026-01-12 / 0 Visits
0
0

批量迁移子模块到本仓库

批量迁移子模块到本仓库

应用场景:

  • 将一个仓库的子模块批量迁移到另一个仓库
  • 只有git子模块迁移,不会迁移其他文件
  • 迁移使用.submodules文件配置

使用方法

将 add_submodules.sh 文件复制到本仓库根目录下,并执行脚本。

#!/bin/bash

# 从 .gitmodules 文件中批量添加 submodule
# 使用方法: ./add_submodules.sh

GITMODULES_FILE=".gitmodules"

if [ ! -f "$GITMODULES_FILE" ]; then
    echo "错误: 找不到 .gitmodules 文件"
    exit 1
fi

echo "开始从 .gitmodules 添加 submodule..."

# 使用 git config 解析 .gitmodules 文件
git config -f "$GITMODULES_FILE" --get-regexp '^submodule\..*\.(path|url|branch)' | while read key value; do
    # 提取 submodule 名称和属性
    if [[ $key =~ ^submodule\.(.+)\.(path|url|branch)$ ]]; then
        submodule_name="${BASH_REMATCH[1]}"
        attribute="${BASH_REMATCH[2]}"

        # 去除 value 中的引号(如果有)
        value=$(echo "$value" | sed "s/^['\"]//; s/['\"]$//")

        case "$attribute" in
            path)
                submodule_path="$value"
                ;;
            url)
                submodule_url="$value"
                ;;
            branch)
                submodule_branch="$value"
                ;;
        esac
    fi
done

# 更好的方法:直接使用 git config 获取所有 submodule 名称
submodules=$(git config -f "$GITMODULES_FILE" --get-regexp '^submodule\..*\.path' | sed 's/^submodule\.\([^.]*\)\.path.*/\1/')

for submodule_name in $submodules; do
    # 获取该 submodule 的配置
    submodule_path=$(git config -f "$GITMODULES_FILE" --get "submodule.$submodule_name.path")
    submodule_url=$(git config -f "$GITMODULES_FILE" --get "submodule.$submodule_name.url")
    submodule_branch=$(git config -f "$GITMODULES_FILE" --get "submodule.$submodule_name.branch")

    # 去除可能的引号
    submodule_path=$(echo "$submodule_path" | sed "s/^['\"]//; s/['\"]$//")
    submodule_url=$(echo "$submodule_url" | sed "s/^['\"]//; s/['\"]$//")
    submodule_branch=$(echo "$submodule_branch" | sed "s/^['\"]//; s/['\"]$//")

    # 检查路径和 URL 是否有效
    if [ -z "$submodule_path" ] || [ -z "$submodule_url" ]; then
        echo "警告: submodule $submodule_name 配置不完整,跳过"
        continue
    fi

    # 检查 submodule 是否已存在
    if [ -d "$submodule_path/.git" ] || [ -f "$submodule_path/.git" ]; then
        echo "跳过: $submodule_path 已存在"
        continue
    fi

    # 添加 submodule
    echo "添加 submodule: $submodule_name -> $submodule_path"
    if [ -n "$submodule_branch" ]; then
        git submodule add -b "$submodule_branch" "$submodule_url" "$submodule_path"
    else
        git submodule add "$submodule_url" "$submodule_path"
    fi

    if [ $? -eq 0 ]; then
        echo "✓ 成功添加: $submodule_path"
    else
        echo "✗ 添加失败: $submodule_path"
    fi
    echo ""
done

echo "完成!"
echo ""
echo "提示: 如果某些 submodule 添加失败,可能是:"
echo "  1. 路径已存在但未初始化为 submodule"
echo "  2. URL 无法访问"
echo "  3. 需要先删除已存在的目录再添加"

示例

bash add_submodules.sh

注意事项

  • 子模块路径不能与本仓库路径相同
  • 子模块路径不能与本仓库路径相同

Comment