由於歷史緣由,剛進小組時,組內主要利用 SVN 做爲興趣部落的代碼託管工具,最近組裏從新定義了一套代碼 Review 規範,而 SVN 不能知足咱們的需求,再加上公司的 Git 平臺已經成熟可用,咱們便萌生了將興趣部落的代碼從 SVN 遷移到 Git 上的念頭。通過幾天的努力,如今代碼已遷移完成,下面就把過程與總結寫下來供你們參考。git
先介紹一個簡單粗暴的方法,TortoiseSVN 有自帶的 Export 功能,能夠將 SVN 的代碼所有導出到一個新的文件夾下。下面簡單描述下步驟,以 Github 爲例。bash
先在 Github 上建一個 repository,並將之 clone 到本地,假設文件夾叫 A。而後找到你要遷移的 SVN 項目,右擊選擇 TortoiseSVN -> Export,選擇 A 文件夾,肯定後 SVN 項目中的代碼便到了 A 文件夾中,下面就能夠將這個項目當作通常的 Git 項目來對待了。svn
說這個方法簡單粗暴,是由於這個方法其實跟將整個 SVN 項目的代碼直接複製粘貼到 Git 項目文件夾下沒多大差異,而且此次到 Github 上的提交會被當成整個項目的第一次提交,也就是之前的提交記錄沒有被遷移過來。工具
若是你想作的完美一點,不只遷移代碼,還要遷移之前的提交記錄,那應該怎麼作呢?那就要用到 git-svn 了,詳細文檔請參考:git-svn。url
使用 git svn clone your-svn-url your-target-folder
能夠將 SVN 的主幹代碼以及提交記錄拉取到了本地目標文件夾 your-target-folder 中。這種方式只能遷移一個特定文件夾的代碼(通常遷移 trunk)。但若是你不只想遷移主幹代碼,還想將 branch 和 tag 的代碼一併遷移,你可使用: git svn clone root-path --trunk="trunk/project" --branches=「branches」 --tags="tags"
。須要注意的是,trunk、branches 以及 tags 的路徑是相對的。若是你的項目很龐大而且有很長的歷史,那麼遷移過程將會很是漫長(以天爲單位)。若是你遷移過程當中很幸運沒碰見程序出錯、電腦崩潰而最終成功的話,你能夠執行 git branch -a
看看分支狀況。由於咱們沒有遷移 branch 和 tag,因此不瞭解有什麼坑。spa
新的文件夾是沒有 .gitignore
文件的,因此須要新建一個。code
當準備工做都作好後,下面能夠將代碼提交到遠程倉庫中:xml
git remote add origin your-git-repository git push -u origin master
若是 SVN 的帳號和 Git 的帳號名稱不同,而且 SVN 中的帳戶就是一個 ID,而 Git 中的帳號是 username 和 email,SVN 的 ID 能夠和 Git 的 username 和 email 在遷移過程當中對應起來,具體作法以下:rem
// 在 SVN 項目根目錄: svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /'
輸出一列 SVN 用戶列表,將之保存到 users.txt 中,而且修改帳號對應關係,格式以下:文檔
zhangsan = 張三 <zhangsan@tencent.com> ... wangwu = 王五 <wangwu@tencent.com>
上面的 zhangsan
就是 SVN 的 ID,後面對應的就是 username 和 email。有了 users.txt 的帳號對應信息,下面能夠遷移了:
git svn clone your-svn-url --authors-file=users.txt your-target-folder
也就是在遷移命令中加入 --authors-file
參數。
總體來看,遷移過程很順利,沒有很複雜的步驟。若是你在遷移中有什麼困惑,能夠去官網上瞧瞧。