Subversion to Git === ###### tags: `git` `subversion` `convert` `GSS` ## 前言 What is Bare Repo: [Git Bare Repo](https://hackmd.io/@hbdoy/BJz0V5tv8) 基本 Git 教學: [Git 筆記](https://hackmd.io/@hbdoy/By5kZvuzx) ## 情境 此情境是需要將 Subversion 上的專案搬到 Git 上,但原本的 Subversion 將會有其他人繼續開發,而 Git 上後續變更的內容將不會推回 Subversioin 上,Subversion 上的版本將不會頻繁地更新回 Git 上,所以更像是 Subversion **單向** 的更新/匯出到 Git 上。 ## 轉換方法 兩種方法 1. git svn(git command 本身支援) 2. [subgit](https://subgit.com/)(第三方工具) ## git svn [參考來源](https://ithelp.ithome.com.tw/articles/10140481) 主要步驟 1. 導出&修改使用者名稱、Email 2. git svn clone ${SVN PROJECT URL} --no-metadata -A SVNUsers.txt --stdlayout ![](https://i.imgur.com/zyY2uF8.png) :::info - 若是轉換太慢可以指定從哪個提交紀錄開始,ex: **-r8021:HEAD** - 網址要打 **https://xxx/ryan_lee/gss/myproject/SOURCE** 不要餵 https://xxx/ryan_lee/gss/myproject/SOURCE/trunk ::: 3. 導出&建立 gitignore(實作過程一直發生錯誤,故放棄透過 git svn 轉換) 4. 添加 remote & push :::success 此方法轉換速度很慢,光是第一步導出使用者就花上很久,推薦直接只用 subgit 來轉換 ::: ## subgit [參考來源](https://blog.miniasp.com/post/2014/09/06/Useful-tools-SubGit-svn-to-git-migration) 此工具可提供 SVN、GIT 雙向同步,此處僅紀錄一次性轉換的主要執行步驟 1. 一樣可以加上 **--minimal-revision XXXX** 來指定要從哪個提交紀錄開始轉換 ``` $ subgit import --non-interactive --minimal-revision 8021 --default-domain gss.com.tw --svn-url https://xxx/ryan_lee/gss/myproject/SOURCE bb13.git ``` ![](https://i.imgur.com/xkJduJH.png) 轉換出來的專案會長這樣,是一個 bare repo ![](https://i.imgur.com/kP9nT0I.png) ### 建立到遠端 git server 1. 到 Gitlab 建立專案 2. Push ``` $ git push --mirror https://git.gss.com.tw/ryan_lee/myproject.git ``` ![](https://i.imgur.com/4ugIPPu.png) 3. Clone ``` $ git clone https://git.gss.com.tw/ryan_lee/myproject.git ``` :::success - 用這個工具轉換很快速,也不用手動導出使用者,只需加 ``--default-domain gss.com.tw`` 就能自動補上 Email - 排除版控的檔案也會自動建立&轉換(.gitignore) - 沒有細看收費的規則,若有更複雜的需求需要自行研究 ::: 4. 原本 Subversion 的 commit 紀錄轉換成功 ![](https://i.imgur.com/8QQbam7.png) ## 將 Subversion 專案更新到曾經匯出的 Git 專案上 :::success 當初將 Subversioin 某個 commit 版本轉成 Git 後進行開發,DB 也 clone 一個當時的狀態。 現在需求希望此 Git 版本改連到統一的 DB,而不是當初 clone 的那個,但是修改 DB 連線後,發現 Schema 有變動,程式也因為脫離 Subversion 版本太久,乾脆就不追查修改報錯的功能,直接將最新 Subversion 版本更新併回 Git 版本。 ::: ## 方法一: 手動複製檔案 選擇要比較的兩個 commit 後按下 ``Compare revisions`` ![](https://i.imgur.com/AzXxOsD.png) 可以直接選取所有差異的檔案,然後右鍵>``Export selection to ...`` ![](https://i.imgur.com/Cu7iozJ.png) 接著就可以把這些變動過的檔案複製進 Git 專案 (匯出時資料夾結構也會一起匯出,很方便) ![](https://i.imgur.com/r10nVSw.png) 但是這種方法會對於想要保存 log 訊息就不管用了 ## 方法二: 轉成一般 Git Repo 再修改來源 ### 僅在本地轉換成 non bare repo 透過 clone 來將 bare repo 轉換成一般 repo ``` $ git clone xxx.git ``` ![](https://i.imgur.com/1Vwscns.png) :::info xxx.git is a bare repo ::: #### 結合現有遠端 repo 1. 更改 remote url ``` $ git remote set-url origin https://git.gss.com.tw/ryan_lee/myproject.git ``` 2. 更新 & 合併 可以直接在 local master 上 pull remote 下來合併 ``$ git pull`` 可能會有衝突需要處理 ![](https://i.imgur.com/eBNa8S2.png) :::info git pull = git fetch + git merge ::: 或是先拉在分支處理衝突 ``` $ git fetch origin master $ git checkout origin/master $ git checkout -b tmp_branch $ git merge master $ git checkout master $ git merge tmp_branch % git push ``` 3. 大功告成,將 Subversion 上的版本與當初轉出來繼續開發的 Git 版本合併,Commit Log 也都存在 ![](https://i.imgur.com/IRCzbKz.png)