将130个Git仓库合并至独立仓库的批量执行问题
批量合并多个Git仓库到单一仓库的解决方案
问题根源
原单次执行脚本未考虑批量场景的清理工作:
- 未移除已添加的远程仓库源,导致后续同名远程冲突
- 未删除临时合并分支,分支名重复导致创建失败
- 移动文件时未确保目标文件夹不存在,引发嵌套问题
- 切换分支前未保证工作区干净,导致分支切换失败
修正后的单仓处理逻辑
针对单个仓库,先确保环境干净再执行合并:
# 定义当前要合并的仓库标识和地址 REPO_ID="010707" REPO_URL="https://zbrobotics@dev.azure.com/zbrobotics/Robotic%20Process%20Automation/_git/010707" # 1. 确保当前在dev分支,且工作区完全同步远程 git checkout dev git pull origin dev git reset --hard origin/dev # 2. 移除可能已存在的同名远程源(避免批量时冲突) git remote remove $REPO_ID 2>/dev/null # 3. 添加远程源并拉取代码 git remote add $REPO_ID $REPO_URL git fetch $REPO_ID # 4. 创建临时合并分支(基于源仓库的dev分支) git checkout -b ${REPO_ID}-merge $REPO_ID/dev # 5. 合并到临时分支(允许无关历史) git merge --allow-unrelated-histories FETCH_HEAD # 6. 创建目标文件夹(先删除已存在的同名文件夹,避免嵌套) if [ -d "$REPO_ID" ]; then rm -rf "$REPO_ID" fi mkdir $REPO_ID # 7. 移动所有文件到目标文件夹(排除.git相关目录) git ls-tree -z --name-only HEAD | grep -z -v "^.git$" | xargs -0 -I {} git mv {} $REPO_ID/ # 8. 提交合并结果 git commit -m "Merge ${REPO_ID} repository into combined-repo" # 9. 切回dev分支并合并临时分支 git checkout dev git merge --allow-unrelated-histories ${REPO_ID}-merge # 10. 推送合并结果到远程 git push origin dev # 11. 清理临时分支和远程源 git branch -D ${REPO_ID}-merge git remote remove $REPO_ID
批量执行脚本
将所有仓库的标识和地址整理成一个列表文件(比如repos_list.txt),每行格式为仓库ID 仓库URL,然后用以下脚本批量处理:
#!/bin/bash # 读取仓库列表文件路径 REPO_LIST="repos_list.txt" # 遍历每个仓库执行合并 while read -r REPO_ID REPO_URL; do echo "=== 开始合并仓库: $REPO_ID ===" # 确保当前在干净的dev分支 git checkout dev git pull origin dev git reset --hard origin/dev # 清理旧的远程源和分支 git remote remove $REPO_ID 2>/dev/null # 添加远程源并拉取代码 git remote add $REPO_ID $REPO_URL git fetch $REPO_ID # 创建临时分支并合并源仓库代码 git checkout -b ${REPO_ID}-merge $REPO_ID/dev git merge --allow-unrelated-histories FETCH_HEAD # 准备目标文件夹并移动文件 if [ -d "$REPO_ID" ]; then rm -rf "$REPO_ID" fi mkdir $REPO_ID git ls-tree -z --name-only HEAD | grep -z -v "^.git$" | xargs -0 -I {} git mv {} $REPO_ID/ # 提交并合并到dev分支 git commit -m "Merge ${REPO_ID} repository into combined-repo" git checkout dev git merge --allow-unrelated-histories ${REPO_ID}-merge git push origin dev # 清理临时资源 git branch -D ${REPO_ID}-merge git remote remove $REPO_ID echo "=== 仓库 $REPO_ID 合并完成 ===" done < "$REPO_LIST"
关键注意事项
- 仓库列表格式:确保
repos_list.txt每行只有一个仓库的ID和URL,无多余空格或空行 - 工作区一致性:脚本中加入
git reset --hard origin/dev,确保每次合并前工作区完全同步远程dev,避免遗留冲突 - 过滤敏感目录:移动文件时排除
.git目录,防止破坏合并后的仓库结构 - 错误抑制:用
2>/dev/null忽略远程源不存在时的错误提示,提升批量执行的稳定性
内容的提问来源于stack exchange,提问作者Vince Van Alphen
相关产品推荐
相关产品推荐

