如何與 svn 版本庫同步

原始問題在 Stack Overflow

提問者只是問「怎麼把 svn 版本庫轉成 git 版本庫?」,通常問題越簡單,答案就越長... orz

剛好那段時間(2017-10) TortoiseGit 有對 clone svn 版本庫做了一點加強,所以乾脆試著藉由這個提問寫一個自認為還算完整的答案如下:

在 Windows 上安裝以下軟體

找出 svn 版本庫的 URL 並複製它

以 TortoiseSVN 版本庫為例:

註:TortoiseSVN 在 2018 年年初已搬到 OSDN 上,詳見 https://osdn.net/projects/tortoisesvn/

使用 TortoiseGit Clone 畫面

在目的地按滑鼠右鍵(例如:D:\SVN\ToGit),然後按選單選項 Git Clone...

勾選 From SVN repository

如果先複製 svn 版本庫的 URL,再喚起 Clone 畫面,TortoiseGit 會自動幫你把剛剛複製的 URL 貼到 Clone 畫面的 URL 輸入欄裡,這樣你就不用自己手動貼一次。你只需要稍微檢查一下 URL 是否正確即可。

同樣地,如果你在目的地喚起 Clone 畫面,TortoiseGit 也會幫你自動填好 Directory 欄位。

如果這個 svn 版本庫使用標準的 Layout(使用 trunk、tags、branches)的話,你也不需要做其它事,唯一要做的就只是勾選 From SVN repository 動作。

按 OK 按鈕開始 Clone

按 OK 按鈕後,就會開始把 svn 版本庫 Clone 成 git 版本庫。

畫面如下:

從輸出文字欄可以看出,其實 TortoiseGit 只是使用 Git for Windows 的 git svn clone 來 Clone svn 版本庫:

git.exe svn clone "svn://svn.code.sf.net/p/tortoisesvn/code/" "D:\SVN\ToGit\tsvn" -T trunk -b branches -t

所以,基本上,你也可以直接使用 Git Bash/CMD 自己下這個指令來達到一樣的結果。

註: 如果你看到 r1r2r3...等資訊,表示它開始正常 clone 了,通常 Clone svn 版本庫需要花滿長的時間,這時候你隨時可以中止 Clone,之後再用一樣的指令繼續未完的 Clone,不需要擔心沒有一次 Clone 完要怎麼辦。
另外,用 Git Bash 會比 Git CMD 快;如果可以的話,請在 Linux 系統下做 git svn clone,因為「超快」。


Clone 本地端的 svn 版本庫

建議用 TortoiseGit 2.4.4+,因為只需要把 svn 本地端的路徑貼到 Clone 畫面的 URL 即可,畫面如下:

同樣地,勾選 From SVN repository

Clone 過程:

TortoiseGit 2.4.4+ 會自動改用 file:/// 來 clone svn 版本庫。


使用上述方法得到一個 git 版本庫後,你可以在 git 版本庫的 master 分支做 commit,然後使用 TortoiseGit -> SVN DCommit... 把這些 commits 上傳回原來的 svn 版本庫,就像 svn 的 commit 動作。

再一次,TortoiseGit 只是執行 git 指令 git svn dcommit

如果原來的 svn 版本庫已經有人做了 commit 動作,表示有新的 commits 需要先更新到本地端 git 版本庫,這時候請用 TortoiseGit -> SVN Rebase,它會抓取 svn 版本庫上新的 commits,然後做一個 merge 或 rebase 到最新的 commit 上,就像 svn 的 update 動作。

在這個過程可以觀察到 TortoiseGit 先使用 git svn fetch,然後再用 git rebase 來完成這件事。

註:如果用 Git Bash/CMD,你只需要使用 git svn rebase


如果你需要更多詳細的資訊和範例,建議閱讀 Pro Git v2 - Chapter 9

results for ""

    No results matching ""