用了比較長時間的 SVN,但現在新的專案都採用Git。之前的專案又不得不維護,那麼能不能將專案從SVN遷移到Git呢。答案是肯定的,網上的方案是 git-svn,或者更高階的封裝 svn2git。
方法其實很明確,匯出SVN的歷史資料,建立新的Git Repo。但是在實際操作中遇到了一些問題,且在這裡記錄一下。這次的操作環境是Windows。
1. git-svn只支援通過網路連線(svn:// 或 http://之類)的方式來轉換
這樣的話,其實比較麻煩,需要提供網路形式的連線方式。一些小專案就是本地建的repo。
git.exe svn clone "file:///D:/Repositories/thirdparty" "F:\Working\CXX\thirdparty-test" -T trunk -b branches -t tags Initialized empty Git repository in f:/Working/CXX/thirdparty-test/.git/ Couldn't open a repository: Unable to open an ra_local session to URL: Unable to open repository 'file:///D:/Repositories/thirdparty': Expected FS format '2'; found format '4' at /usr/lib/perl5/site_perl/Git/SVN.pm line 310 git did not exit cleanly (exit code 1) (2344 ms @ 2013/8/17 10:11:08)
2. 利用TortoiseSVN自帶的svnserve.exe來提供svn://連線方式
D:\Repositories>"E:\Progs\TortoiseSVN\bin\svnserve.exe" -t -r D:\Repositories ( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops atomic-revprops partial-replay ) ) ) D:\Repositories>"E:\Progs\TortoiseSVN\bin\svnserve.exe" -i -r D:\Repositories ( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops atomic-revprops partial-replay ) ) ) D:\Repositories>"E:\Progs\TortoiseSVN\bin\svnserve.exe" -i --listen-port 3690 -r D:\Repositories ( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops atomic-revprops partial-replay ) ) ) D:\Repositories>"E:\Progs\TortoiseSVN\bin\svnserve.exe" -i --listen-port 13690 -r D:\Repositories ( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops atomic-revprops partial-replay ) ) ) D:\Repositories>"E:\Progs\TortoiseSVN\bin\svnserve.exe" -d --listen-port 13690 -r D:\Repositories
之前一直連不上,出現下面的錯誤:
svn Connection refused at /usr/lib/perl5/site_perl/Git/SVN.pm line 310
利用-d選項後,可以實現正常訪問。
3. 轉換之後,可以將這個repo推到倉庫中。
參考連結: