The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

介紹好用工具:SubGit ( 輕鬆將 SVN 專案移轉到 Git 的工具 )

前陣子大量將公司現有放在 Subversion (SVN) 的專案移轉到 Git 進行版控,有些搬到 GitHub,有些則搬到 Visual Studio Online,過程中我研究、測試了很多套移轉工具,大部分工具都需要做很多前置作業才能執行 Svn to Git 移轉專案,不過我最終選擇了 SubGit 這套工具,他是讓你花最少時間 (幾乎不用準備使用者對應檔) 就可以移轉成功的一套了,我們來看看這套工具如何使用吧!

這套 SubGit 功能強大,不單單能當 Svn to Git 移轉工具,還能雙向同步於 SVN 與 Git 之間,非常厲害,所以相對的用起來也比較複雜些。不過我們今天的重點在於「移轉專案」,所以我不打算講其他的用法,僅單就你要一次性將 Svn 移轉到 Git 的這個用途而已。

下載 SubGit ( 目前最新版為 v2.0.2 版 )

下載之後,將壓縮檔解壓縮。我則是將檔案解壓縮至 C:\Program Files\SubGit 目錄下,如下圖示:

image

設定環境變數

請在我的電腦設定 PATH 環境變數,加入 C:\Program Files\SubGit\bin 這個路徑,如下圖示,照著圖標操作即可設定完成: ( 點圖可放大 )


修正 Java 執行檔路徑

由於 SubGit 是用 Java 寫成的,你必須先安裝 JRE 才能執行 SubGit,不過安裝好之後也不見得能夠執行,你一樣也要設定好 PATH 的環境變數,並指向 java.exe 執行檔的所在目錄,才能正確執行。

如果你跟我一樣,不想將 Java 的執行檔路徑加入 PATH 環境變數的話,可以去修改 C:\Program Files\SubGit\bin\subgit.bat 檔案,把第 53 行的以下這行:

if "%JAVACMD%"=="" set JAVACMD=java

修改成以下: ( 請注意 java.exe 的執行路徑要設定正確喔! )

if "%JAVACMD%"=="" set JAVACMD="C:\Program Files (x86)\Java\jre7\bin\java.exe"


執行匯入工作

要完成 SVN 到 Git 的移轉,大致步驟如下:

  1. 將 SVN 專案透過 SubGit 變成 Git 本地儲存庫 (Local Repository)
  2. 再將 Git 本地儲存庫 mirror (鏡像) 到 遠端儲存庫 (Remote Repository),如 GitHubVSO

要將 SVN 專案透過 SubGit 變成 Git 本地儲存庫,通常沒那麼簡單,因為在 SVN 版本庫中只有留下使用者帳號 ( User ID ) 而已,而 Git 必須要有完整的使用者 Email 位址才能建立版本,而你又要保留 SVN 版本庫中的所以歷史紀錄,所以你勢必要事先準備一個「作者對應表」(Authors Mapping),這樣才能在 Git 版本中寫上這位使用者的 Email 地址。

而 SubGit 好就好在,在執行匯入的時候可以設定 --default-domain 參數,設定預設的 Email 域名!

例如,當你在執行匯入的時候設定了,當你執行 SubGit 時的參數是 --default-domain miniasp.com,那當你某個版本的作者 username 為 will 的時候,他就會預設將這個作者的 Email 對應成 will@miniasp.com,是不是非常方便呢! ^_^

匯入指令範例如下: ( 請記得將 修改成你公司自己的域名 )

subgit import --non-interactive --default-domain miniasp.com --svn-url https://tfs2010:8443/svn/WWWExam  WWWExam.git

上述指令執行後,通常可以很順利的建立 WWWExam.git 資料夾,而這目錄將會是一個 裸儲存庫 (Bare Repository),如果你要將一個裸儲存庫 git push 到遠端儲存庫,可以參考以下指令:

cd WWWExam.git
git push --mirror https://remote.add.ress/WWWExam.git


如此一來,專案就順利移轉完成了!

我用這套工具一口氣轉移了快一百個專案 (透過批次檔),所以真的非常方便。不過,還是有注意事項!

目前的 SubGit v2.0.2 版針對非標準版控結構的 SVN 移轉會有問題,也就是說,如果你的 SVN 版控沒有一開始就先建立 trunk / branches / tags 資料夾結構的話,是沒辦法成功執行的!以下是利用 TortoiseSVN 建立 SVN 儲存庫時的圖示:

不過我從這篇討論得知,SubGit 在未來的 v2.1 版可能才會提供非標準版控結構的 SVN 專案。

相關連結