git多仓库迁移合并方案

1,034 阅读2分钟

背景:

随着monorepo架构的落地,需要将现有的多个独立工程仓库代码合并迁移到新的monorepo工程仓库,并且需要保留原有工程的commit记录。

期望:

  1. 迁移order项目的master分支到新工程的order-web目录
  2. 迁移product项目的master分支到新工程的product-web目录
  3. 迁移后的目录结构如下
monorepo-web(master分支)
├── .git
├── common
└── packages
    └── order-web(master分支)
    └── product-web(master分支)

步骤:

  1. 准备合并用的工程目录
mkdir mergeWorks && cd mergeWorks
  1. 切换到mergeWorks目录,拉取monorepo仓库,指定master分支
git clone -b master  git@192.168.0.0:xx/monorepo-web.git
  1. 拉取order、product仓库
cd ..
// 注意: 当前操作在mergeWorks目录下进行
git clone git@192.168.0.0:xx/order.git
git clone git@192.168.0.0:xx/product.git
// 如果不合并master分支,可以指定分支
git clone -b develop git@192.168.0.0:xx/order.git
git clone -b develop git@192.168.0.0:xx/product.git
// 这时mergeWorks结构如下
mergeWorks
├── monorepo-web
├── order
│   └── .git
│   └── src
└── product
    └── .git
    └── src
  1. 调整目录结构
// 切换到子工程目录
cd order
// 新建目录(重命名工程)
mkdir order-web
// 使用git mv 将所有文件移动到order-web(除了.git文件)
// git mv <source> ... <destination directory>
// 例:
git mv src package.json order-web
// 移动后的子工程目录
order
└── order-web
    └── src
    └── package.json
// 对改动进行`git commit`操作
// 只操作本地,不要进行push origin操作
git add .
git commit -m 'order-web结构改造'

分别对其它子工程进行上面操作

  1. 将子工程添加为monorepo-web主工程的远程库
cd ..
cd monorepo-web
git remote add order-web ../order
git remote add product-web ../product
// 添加完之后记得检查一下
git remote -v
  1. 添加子工程的辅助分支
// fetch 下所有子工程仓库
git fetch --all
// 创建子项目对应的辅助分支
git checkout -b order-web order-web/master
git checkout -b product-web product-web/master
  1. 合并辅助分支
// 切回主分支
git checkout master
// 合并分支 因为原本几个仓库不相关,所以合并时,需要加上 `--allow-unrelated-histories`
git merge order-web --allow-unrelated-histories
git merge product-web  --allow-unrelated-histories
  1. 将子工程移动到package目录下
git mv order-web packages
git mv product-web packages
  1. 清除临时分支和remote仓库
// 删除远程仓库链接
git remote remove order-web
git remote remove product-web
// 删除辅助分支
git branch -D order-web
git branch -D product-web
// 最后push到远程仓库
git push origin master
// 远程仓库最终的目录结构
monorepo-web(master分支)
├── .git
├── common
└── packages
    └── order-web(master分支)
    └── product-web(master分支)