背景:
我們原來的代碼庫是這樣的,[email protected]:a.work.git(簡稱a倉庫)
代碼總庫work下分爲兩個文件夾,develop作爲開發和測試庫,release作爲生產庫。各自文件夾內區分不同項目,比如有三個項目分別aPro、bPro、cPro,目錄結構如下:
- work
-develop
-aPro
-bPro
-cPro
-release
-aPro
-bPro
-cPro
需求:
現需要將a庫中的aPro遷移至[email protected]: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 [email protected]: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 ,就可以處理衝突 然後提交代碼了