批量迁移子模块到本仓库
应用场景:
- 将一个仓库的子模块批量迁移到另一个仓库
- 只有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
注意事项
- 子模块路径不能与本仓库路径相同
- 子模块路径不能与本仓库路径相同