背景:
我们原来的代码库是这样的,git@git.a.com:a.work.git(简称a仓库)
代码总库work下分为两个文件夹,develop作为开发和测试库,release作为生产库。各自文件夹内区分不同项目,比如有三个项目分别aPro、bPro、cPro,目录结构如下:
- work
-develop
-aPro
-bPro
-cPro
-release
-aPro
-bPro
-cPro
需求:
现需要将a库中的aPro迁移至git@git.b.com:b.work.git(简称b仓库)
如果直接拷贝一份代码推送到b仓库,那么b仓库只有这一次推送的记录,之前的commit都没有保留,这肯定是我们不希望的。那么如何保留commit的进行git库迁移呢
操作:
使用git subtree split -P path/folder -b branchName
直接在要拆分的分支上执行该命令,会形成一个新的分支
- 在a仓库的master分支新创建一个迁移aPro的分支
git checkout -b feature/aPro
- 在这个新的分支执行git subtree split -P path/folder -b branchName
git subtree split -P develop/aPro -b feature/dev_aPro
- 此时我们得到了feature/dev_aPro分支
- 关联b仓库
git remote add newOrigin git@git.b.com:b.work.git
- 查看是否关联成功,此时可以看到共有四条origin 两个a库的 两个b库的
git remote -v
- 将 feature/dev_aPro推送到新库
git push newOrigin feature/dev_aPro:feature/dev_aPro
此时已经将aPro项目推送至b仓库了,并且保留了原来的commit
原a库的代码还有遗留或开发中:
假如时间顺序是这样的,a库中有一个分支正在改造aPro项目,而我开始迁移库的时候是从master新创建的分支做的迁移,这就导致b仓库中没有这个正在开发的分支的代码。
那么等到a库中进行中的分支执行完成,需要把落后的这一次提交也迁移到b仓库,做法和上边是一样的,还是在master新创建一个分支,将这个分支推送到b仓库的指定分支,此时这个新的分支去pull之前的那个分支,
会出现refusing to merge unrelated histories的错误。
此时需要使用
git pull origin master --allow-unrelated-histories
来强制将两个分支指向同一个源
执行完之后再去pull ,就可以处理冲突 然后提交代码了