git 多库房兼并

原因

一般来说,git 库房是不用容易改动的,可是其间一个管理后台项目拆成了十个 git 库房,跑项目又要新建一个 project 目录,把这十个库房克隆到 project 里面,根目录是projec, 底下有 A,B,C…等加起来十个目录,需求放在一同才能跑,而且 readme 没说明怎样跑,库房也是分隔的,不知道总共有几个要clone,导致跑项目都要探索很久,而且分隔增加了提交代码的工作量,假定一次改五个项目,那么每次合代码都会提五个merge,如果不是分隔布置,这样的拆分既增加了工作量,又增加了提交代码的危险,因而打算把这十个库房兼并成一个库房。

计划

要把这十个目录放到一个目录底下,而且是坚持本来的目录,简略的库房 merge 会导致目录打平。

计划一(不引荐)

把一切项目克隆到 project 项目,删掉每个项目的 .git 目录,把 project 项目初始化为 git 库房,推到长途即可,可是这个方法的缺陷是会丢掉一切库房的commit,这个作为最后的计划,暂不考虑。

计划二

为了方便说明,咱们分别用用两个目录A,B示例,组成一个库房

思路介绍:

  1. 把A,B库房,克隆名到为 old_project 的文件夹下
    一定从头创立文件夹 old_project,不要直接用本来存在的开发目录,后边会对old_project做修正,除非确定不再需求修正原开发目录。
# 创立目录
mkdir project 
cd project
# 克隆库房
git clone htts://xxx.com/A
git clone htts://xxx.com/B

old_project 的文件夹目录应该如下:

old_project
|----A
|----B
  1. 再初始化一个新项目 project,示例 old_project 和 project 是同级目录,这个在后边的途径运用很重要,如果不是同目录,需求清楚这两个目录的层级联系
mkdir project
cd project
# 初始化库房
git init
# 默许是 master 分支,主张切到一个用来 merge 的分支,误操作后还能从头基于 master 创立分支。

# 设置新库房的长途源
git remote add origin htts://xxx.com/project

前面过程比较简略,这时候关键过程来了,下面的过程千万不能省掉,需求用 git mv 指令对文件进行转移,而且不会丢掉 commit 记录。

  1. 回到 old_project 目录,把各个目录下的文件收拢到一个目录,这是必要的过程
# 进入其间一个子目录
cd old_project/A
git checkout master # 看情况选择自己需求兼并的分支 默许master
mkdir A # 没错 再建一个A目录,如果想重命名,能够改
# B目录只要把 两处 A 改成 B 即可
ls -A | grep -wv '.git|A' xargs -t -I 'file' git mv file A/file
git add .
git commit -m 'chore: A库房兼并'

咱们来看一下履行完的文件目录结构:

old_project
|--A
|  |-A
|--B
|  |-B

B 库房重复上述过程即可,不用推送到远端

  1. 回到项目 project 目录,增加 old_project 作为 project 的源。

增加长途的命令为:git remote add <长途源别号> <长途源地址>

咱们平常拉项目的时候,相当于 git remote add origin xxx.com/old_project

cd project
# 把A、B库房增加为长途源,源地址能够是链接,也能够是本地途径
git remote add A ../old_project/A
git remote add B ../old_project/B
# 查看 长途源
git remote -v
# todo 补充 remote 命令成果
git fetch --all

设置了源以后,咱们的分支从这个源来创立,回到 project 项目:
分别从刚才的目录创立两个分支

cd project
git checkout -b A origin/A
git checkout -b B origin/B

把本地的 old_project 当做源,创立两个分支,此刻关于 old_project 下的文件结构是这样:

old_project
|--A
|  |-A
|--B
|  |-B

关于 A 库房来说,它里面还有一个A目录,B 也是如此,咱们要把 A 搬到新项目 project 目录下,就必须对其进行打包为一个目录,不然兼并的时候,A,B目录兼并到新项目目录会打平A、B的根目录到 project 根目录,形成冲突。

下面开端兼并库房:

git merge A --allow-unrelated-histories
git merge B --allow-unrelated-histories 

--allow-unrelated-histories 这个参数答应无关提交历史兼并,两个库房兼并如果没有这个参数,git 是回绝兼并过程的。

最后,再把新库房的代码提交,push 到远端,就能得到与本来目录相同的库房啦。

总结

再次总结一下移动的思路,首先是把本来的库房克隆到一个新的目录,然后把各个库房的文件收拢到一个目录,然后再把这个目录的文件兼并到新的库房,这样就能得到一个新的库房了。