一、 背景
有两个Git仓库,分别为 project_a、project_b,
1
2
project_a:远程地址为:git@github.com:xxxx/project_a.git ,分支为master
project_b:远程地址为:git@github.com:xxxx/project_b.git ,分支为master
需要将这两个仓库合并为一个,放在一个父目录下,要求的目录格式如下:
1
2
3
project_all
-- project_a
-- project_b
通常的合并项目的做法是,将所有项目移动到一个新目录中,并重新生成纳入 git 管理(去掉了.git 文件夹),这样做的弊端是之前的历史提交记录都没有了,想要看之前的记录,还需要再回到旧项目中查看。
此时明显不满足需求,需要保留原有的提交记录,具体操作步骤如下。
二、操作步骤
新建 project_all 仓库,并将project_all 仓库下载至本地
1、在 project_all 中添加 project_a,project_b 的远程分支。
1
2
git remote add origin_project_a git@github.com:xxxx/project_a.git
git remote add origin_project_b git@github.com:xxxx/project_b.git
可通过如下命令验证是否添加成功
1
git remote -v
2、获取子目录的分支数据
在 project_all目录下,获取 project_a, project_b 的 master 分支数据
1
2
git fetch origin_project_a master
git fetch origin_project_b master
3、合并代码并移动到子目录中
1
2
3
4
5
6
7
8
9
10
11
12
13
# 合并,并保留历史
# --allow-unrelated-histories 的意思是,允许合并不相关历史
git merge origin_project_a a/master --allow-unrelated-histories
# 新建子文件夹
mkdir project_a
# 移动到此文件中(排除需要忽略的文件夹)
# 可能会报错误 `-bash: !: event not`,执行一下命令 `shopt -s extglob`
git mv !(.|..|.git|project_a) project_a
# 生成一条commit日志
git add . && git commit -m "merge project_a_master and mv to project_a"
# project_b 操作方式和上述一致
4、推送远程
1
2
git remote add origin git@github.com:xxxx/project_all.git
git push -u origin master
5、删除远程库
删除远程库 project_a、project_b
1
2
git remote rm origin_project_a
git remote rm origin_project_b