1、背景
在实际场景中,我们会将服务进行拆分, 也可能需要重构,将多个服务模块进行合并,简化维护。 如何将多个GIT项目统一合并迁移至一个项目, 并且又可以保留各个版本的历史记录? 下面讲解具体操作步骤。
2、迁移说明
将原来的三个GIT工程: monitor-datasource、monitor-system和monitor-performance,合并至新工程monitor。同时,需要将原来的多个分支monitor_main和monitor_uat合并迁移,并保留原有的历史commit记录。
3、操作步骤
1、建好合并的新工程
创建好monitor.git工程, 并克隆至本地:
cd test
git clone http://gitlab.local/operation.git
2、预先创建好需要迁移的各版本
先把要迁移的各版本建立好, 最好从空分支建立,不要留有任何文件;在本地创建好分支即可, 先不用提交至仓库:
git branch monitor_main
git branch monitor_uat
3、添加要合并的GIT工程信息
把要合并的GIT工程模块, 加入进来:
# 进入新工程目录
cd operation
# 添加分支工程地址
git remote add monitor-datasource http://gitlab.local/operation/monitor-datasource.git
git remote add monitor-system http://gitlab.local/operation/monitor-system.git
git remote add monitor-performance http://gitlab.local/operation/monitor-performance.git
4、拉取各分支版本信息
拉取要合并的GIT工程模块的对应分支版本信息:
git fetch monitor-datasource monitor_main
git fetch monitor-system monitor_main
git fetch monitor-performance monitor_main
git fetch monitor-datasource monitor_uat
git fetch monitor-system monitor_uat
git fetch monitor-performance monitor_uat
如果分支版本太多, 可以直接拉取所有
git fetch --all
5、对分支代码进行合并
先合并monitor_main版本代码。
对 monitor-datasource、monitor-system和monitor-performance三个模块依次进行合并操作:
1)合并monitor-datasource工程模块
#合并monitor-datasource工程
git merge -m "merge module" monitor-datasource/monitor_main --allow-unrelated-histories
#创建monitor-datasource目录
mkdir monitor-datasource
#将合并的代码移动至刚创建的monitor-datasource目录
ls -A | grep -wv '.git\|monitor-datasource\|monitor-system\|monitor-performance' | xargs -t -I '{}' git mv {} monitor-datasource/{}
# 进行代码的添加与提交
git add. && git commit -m "merge init"
2)合并monitor-system工程模块
#合并monitor-system
git merge -m "merge module" monitor-system/monitor_main --allow-unrelated-histories
#创建monitor-system目录
mkdir monitor-datasource
#将合并的代码移动至刚创建的monitor-system目录
ls -A | grep -wv '.git\|monitor-datasource\|monitor-system\|monitor-performance' | xargs -t -I '{}' git mv {} monitor-system/{}
# 进行代码的添加与提交
git add. && git commit -m "merge init"
3)合并monitor-performance工程模块
#合并monitor-performance
git merge -m "merge module" monitor-performance/monitor_main --allow-unrelated-histories
#创建monitor-performance目录
mkdir monitor-performance
#将合并的代码移动至刚创建的monitor-performance目录(注意这里要排除已经创建的目录)
ls -A | grep -wv '.git\|monitor-datasource\|monitor-system\|monitor-performance' | xargs -t -I '{}' git mv {} monitor-performance/{}
# 进行代码的添加与提交
git add. && git commit -m "merge init"
注意, 合并完后先不用push提交, 待所有版本都合并完再提交。
6、对其他版本的分支代码进行合并
上面我们预先创建好了不同的版本分支, 这里直接切换至不同的分支
git checkout monitor_uat
再参照第5个步骤,依次对各模块进行合并处理
git merge ...
7、最后, 将提交的信息推送至远程仓库
将创建合并好的各分支版本, 推送至远程仓库:
git push origin monitor_main
git push origin monitor_uat
至此, 就完成了多GIT项目多版本的迁移, 并且可以完整的保留commit历史提交记录。
附:清理remote远程仓库信息:
git remote remove monitor-datasource
git remote remove monitor-system
git remote remove monitor-performance
删除本地的分支:
git branch -D monitor_uat