You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:12:36