背景:
随着monorepo架构的落地,需要将现有的多个独立工程仓库代码合并迁移到新的monorepo工程仓库,并且需要保留原有工程的commit记录。
期望:
- 迁移order项目的master分支到新工程的order-web目录
- 迁移product项目的master分支到新工程的product-web目录
- 迁移后的目录结构如下
monorepo-web(master分支)
├── .git
├── common
└── packages
└── order-web(master分支)
└── product-web(master分支)
步骤:
- 准备合并用的工程目录
mkdir mergeWorks && cd mergeWorks
- 切换到mergeWorks目录,拉取monorepo仓库,指定master分支
git clone -b master git@192.168.0.0:xx/monorepo-web.git
- 拉取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
- 调整目录结构
// 切换到子工程目录
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结构改造'
分别对其它子工程进行上面操作
- 将子工程添加为monorepo-web主工程的远程库
cd ..
cd monorepo-web
git remote add order-web ../order
git remote add product-web ../product
// 添加完之后记得检查一下
git remote -v
- 添加子工程的辅助分支
// fetch 下所有子工程仓库
git fetch --all
// 创建子项目对应的辅助分支
git checkout -b order-web order-web/master
git checkout -b product-web product-web/master
- 合并辅助分支
// 切回主分支
git checkout master
// 合并分支 因为原本几个仓库不相关,所以合并时,需要加上 `--allow-unrelated-histories`
git merge order-web --allow-unrelated-histories
git merge product-web --allow-unrelated-histories
- 将子工程移动到package目录下
git mv order-web packages
git mv product-web packages
- 清除临时分支和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分支)