最近有些版控需要從 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/