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