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

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

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

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

[下載](https://subgit.com/download/)之後，將壓縮檔解壓縮。我則是將檔案解壓縮至 **C:\\Program Files\\SubGit** 目錄下，如下圖示：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e77284ccec15643884b3-image_2519.png "image")  

**設定環境變數**

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0d8012e7233f8bcb2d7d-image_thumb_200.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f76b24a20e2d3f2eb5ab-image_2520.png)  

**修正 Java 執行檔路徑**

由於 SubGit 是用 Java 寫成的，你必須先安裝 [JRE](https://www.java.com/en/download/) 才能執行 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)，如 [GitHub](https://github.com/) 或 [VSO](http://www.visualstudio.com/)

要將 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 儲存庫時的圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5644c068c3ed451bec97-image_2521.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2750cd3eed0fdbb0cfb2-image_2522.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/159524da03116771e8f2-image_2523.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1f5f0e9d50edade7f7e5-image_2524.png)

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

**相關連結**

-   [SubGit :: Svn To Git Migration](http://subgit.com/)
