SVN Migrate to Git

最近有些版控需要從 svn 搬遷至 git

然而兩者的格式是完全不同的

所幸 git svn 這個工具有提供一些轉換的幫忙

然而並不是全部都是那麼自動的

版控中最重要的東西莫過於 changelog

因為要帶有 author 與 changelog, branch, tags

如果不需要 change log 的異動資料,其實在 svn clone 下來直接拋到 git 即可,不需花上太多功夫

但若要保留最重要的 changelog 資料,那麼就得往下看下去了

SVN 轉到 Git 首先得先要確認要轉換的 svn 的來源資料格式是不是 standard

如果不確定是不是 standard 可以參考這篇文章

standard 的格式基本上包含了三個 folder,分別是 trunk, branches, tags

若是非 standard 格式的資料格式

用 gitsvn, subGit 或是 tortoiseGit 在做轉換時都有可能會有問題

若是 standard 可以參考保哥這篇用 subGit 的做法快速闖關

一般來說 root 都會是 standard 的格式,但底下再往下開的 repo 就不一定是 standard 了

但今天所展示的不是 standard,所以會多花幾個步驟

1. 首先需要先安裝 tortoiseSVN 工具
記得需要把 command line 的功能安裝起來

可參考這裡的安裝方式

裝完之後 command line 就有 svn 的功能了

先透過 svn 把資料先 clone 到本機(ex: c:\svnTest)

2. 先建立使用者列表 authors file
使用 powershell 

cd c:\svnTest
svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique

就會幫你把目前所有 log 的 author 全部抓出來,但是卻沒有 domain

ace.lee = ace.lee <ace.lee>

複製下來後使用 excel 修改成

ace.lee = ace.lee <ace.lee@xxx.yyy>

存到 c:\svnTest\authors.txt

3. git svn 轉換資料
先建立要轉換的目的端 c:\svn2gitTest

於 command line 執行 (因為是非 standard 格式,需使用 --no-minimize-url)

cd c:\svnTest
git svn clone http://[svn root]/[your repo]  --no-minimize-url -A authors.txt c:\svn2gitTest

source tree的文件有提到較大的 commit 大概會花上數個小時轉換

converting a 400MB repository with 33,000 commits on master took around 12 hours 

轉換完成後的格式

最後就會轉成你所熟悉的 git 格式,到這個步驟大概也快完成了


5. 將轉換完成的資料上傳至 git
可以透過 source tree 或是你熟悉的方式處理

git remote add origin ssh://git@xxx/yourRepo.git
git push -u origin --all

另外在 remote 的部份也可以發現會建立 svn 的連結

我這裡使用的是 sourceTree

當你要 push 到遠端的時候,會很貼心提示要不要從 svn 再檢查有沒有新的 commit

6. 檢查 git 的commit, author 記錄


後話:

若不是 standard格式,在做轉換 svn 到 git 一開始是相當花時間

這篇只展示到 author 與 changelog 的部份

若是有 tags 或是 branch 需要一併轉換的話,可以參考這篇

參考資料
https://stackoverflow.com/a/9874961
https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git?view=azure-devops
https://www.twblogs.net/a/5bab9e4c2b7177781a0ec3ad/