SVN 遷移至 Git 指南
從SVN遷移至Git
將程式碼從SVN遷移至Git時,若不關注SVN的歷史提交記錄,則直接將一份原始碼提交至遠端Git倉庫即可;但對於大多數專案,歷史提交則是對團隊比較寶貴的記錄,若要匯出SVN的歷史記錄,則需要藉助Git與SVN是雙向橋接的特性,即 git svn 1 ,它允許你使用Git作為連線到SVN有效的客戶端,這樣你可以使用Git所有本地的功能然後如同正在本地使用SVN一樣推送到SVN伺服器。
它可以快速的幫你從指定svn中克隆(預設包含所有tags,branches),其中--authors-file可以幫助你解決git與svn的相容問題(即匯入後用戶郵箱為不匹配),只需要按如下格式新增svn的使用者及郵箱至指定檔案(e.g. authors.txt)即可,例如:
當然,你也可以新增指定的命令來完成你的拉取過程,例如 :
--revision 1:HEAD 指定revision的範圍
--ignore-paths="^[^/]+/(?:branches|tags)" 忽略所有branch與tags的拉取,更多命令可以參照 git svn 1 中內容。
加速你的遷移
git svn clone的執行速度取決於你svn專案的規模以及服役時間的長短,一般專案可以在幾十分鐘內搞定,但如果是較大的專案,fetch到所有的commits可能需要幾小時甚至是幾天的時間,這無疑會對遷移會造成一定困擾;在svn遷移至git的過程中,往往並不是所有的tag和branch都是我們需要的,這裡也為大家介紹幾種踩過坑的方式:
一、直接獲取某一分支
svn路徑直接指定分支即可,這樣最為簡單粗暴,好處是拉取後branch直接作為master並儲存了所有從這個分支開始的提交記錄,缺點是svn中其他分支的資訊全部丟失。
二、通過修改git配置檔案
我們之前提到的git svn clone命令,其實本質執行了(git svn init 和 fetch)兩個步驟,在git svn init的過程中,建立了本地倉庫並建立了與svn的對映關係,然後通過git svn fetch拉取svn的commits,我們可以git svn init建立對映後,通過更改$GIT_DIR/config檔案中svn的配置,達到縮小分支範圍的目的,e.g. 如下配置則將分支範圍限定在red和green分支,tags範圍則限制在1.0和2.0:
更多參考配置可參考:
git svn config configuration 2 。
上傳至遠端倉庫
在將svn克隆至本地git倉庫時,你會發現本地並未自動建立svn中的branch和tags,而svn的branches和tags顯示在了git的遠端分支中,如下圖所示,究其原理, 傳送門 3 給大家:
在svn中,如果你的branch或tag只做釋出用,其對應的記錄資訊對於團隊並不重要的話,直接新增遠端git倉庫並push到master即可。
但若branch或tag中的資訊比較重要,你則需要將分支checkout至本地,並push到遠端,以免資訊丟失;又如果你的團隊出於某種原因,已經很久沒有在trunk上開發,而一直在branch上開發的話,你又不想在遷移後,存在若干個branch,也嘗試直接將branch(事先checkout到本地)覆蓋到master。
Tips:
1、如果單次push過程中有超過500M的大檔案,推薦走LFS的方式上傳即可完美解決。
像SVN一樣的程式碼提交檢查(甚至更好)
相信部分團隊會利用svn強制關聯功能對於check-in會有一些強制約束(例如,不關聯需求單或bug單資訊則無法提交程式碼),而針對於本地的commits code平臺卻難監管,本地提交檢測,git hook是一個不錯的選擇,它提供了各個不同階段的hook,例如針對commit操作有如下hook(更多的請參考 git-hook 4 ):
而本地hook都被存放本地$GIT_DIR中(即.git/hooks),同時也提供了一些例子(shell+perl),當然它也支援python和ruby,接下來以檢查是否與tapd關聯為例,以一些python程式碼片段來描述下如何編寫本地hook:
1.在.git/hook目錄中,將commit-msg.sample重新命名為commit-msg,並更改如下內容:
其中$1則為提交資訊的臨時檔案路徑。
2.在.git/hook目錄中建立commit-msg.py, python指令碼中編寫對應的驗證邏輯,例如下:
若提交不符合規範,則直接提示並本地打回。
依託於本地的hook,我們甚至可以建更多的程式碼檢查放在本地提交程式碼時,而不是依託各種平臺的較長反饋鏈,例如我們團隊,就會在本地提交前執行cpplint並將錯誤提示給commiter。
文章內附連結如下:
1、 git svn官網:
https://git-scm.com/docs/git-svn
2、 git svn config configuration官網:
https://git-scm.com/docs/git-svn#_configuration
3、傳送門 官網 :
https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80
4、 git-hook 官網 :
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
後期我們會根據每個維度陸續寫相關的測試文章,如果你有興趣,請關注我們哦。
長按指紋識別圖中的二維碼,獲取更多測試乾貨分享!將我們公眾號置頂 不會漏掉我們的原創乾貨哦!

