Git

Git如何将多个工程合并为一个并保留提交记录

Git如何将多个工程合并为一个并保留提交记录

Posted by shrmars on April 11, 2024

一、 背景

有两个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