興趣部落的Git遷移實踐
寫在前面:各位小夥伴,好久不見!專欄已經好久不更了,主要最近換了個團隊,大部分時間放在了適應、學習上面,現在加入團隊已有一段時間,是時候做一些沉澱了。博主的團隊主要做手機 QQ 上的「興趣部落」項目,便心生一念,為何不寫一個系列的文章?就叫「興趣部落實踐」系列吧!下面是系列的第一篇。
下面是正文~~~~~~
因為歷史原因,剛進小組時,組內主要利用 SVN 作為興趣部落的代碼託管工具,最近組裡重新定義了一套代碼 Review 規範,而 SVN 不能滿足我們的需求,再加上公司的 Git 平台已經成熟可用,我們便萌生了將興趣部落的代碼從 SVN 遷移到 Git 上的念頭。經過幾天的努力,現在代碼已遷移完成,下面就把過程與總結寫下來供大家參考。
方法1
先介紹一個簡單粗暴的方法,TortoiseSVN 有自帶的 Export 功能,可以將 SVN 的代碼全部導出到一個新的文件夾下。下面簡單描述下步驟,以 Github 為例。
先在 Github 上建一個 repository,並將之 clone 到本地,假設文件夾叫 A。然後找到你要遷移的 SVN 項目,右擊選擇 TortoiseSVN -> Export,選擇 A 文件夾,確定後 SVN 項目中的代碼便到了 A 文件夾中,下面就可以將這個項目當做一般的 Git 項目來對待了。
說這個方法簡單粗暴,是因為這個方法其實跟將整個 SVN 項目的代碼直接複製粘貼到 Git 項目文件夾下沒多大差別,並且這次到 Github 上的提交會被當成整個項目的第一次提交,也就是以前的提交記錄沒有被遷移過來。
方法2
如果你想做的完美一點,不僅遷移代碼,還要遷移以前的提交記錄,那應該怎麼做呢?那就要用到 git-svn 了,詳細文檔請參考:git-svn。
使用 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,所以不了解有什麼坑。
新的文件夾是沒有 .gitignore 文件的,所以需要新建一個。
當準備工作都做好後,下面可以將代碼提交到遠程倉庫中:
git remote add origin your-git-repositoryngit push -u origin mastern
用戶對應
如果 SVN 的賬號和 Git 的賬號名稱不一樣,並且 SVN 中的賬戶就是一個 ID,而 Git 中的賬號是 username 和 email,SVN 的 ID 可以和 Git 的 username 和 email 在遷移過程中對應起來,具體做法如下:
// 在 SVN 項目根目錄:nsvn log --xml | grep author | sort -u | perl -pe s/.>(.?)<./$1 = /n
輸出一列 SVN 用戶列表,將之保存到 users.txt 中,並且修改賬號對應關係,格式如下:
zhangsan = 張三 <zhangsan@tencent.com>n...nwangwu = 王五 <wangwu@tencent.com>n
上面的 zhangsan 就是 SVN 的 ID,後面對應的就是 username 和 email。有了 users.txt 的賬號對應信息,下面可以遷移了:
git svn clone your-svn-url --authors-file=users.txt your-target-foldern
也就是在遷移命令中加入 --authors-file 參數。
整體來看,遷移過程很順利,沒有很複雜的步驟。如果你在遷移中有什麼困惑,可以去官網上瞧瞧。
推薦閱讀:
※移動端開發技術概覽
※socket.io 的詳細工作流程是怎樣的?
※Vue.js 和 MVVM 的小細節
※如何理解楊博老師對 DOM 操作複雜度的評論?
※面試系列之四:你真的了解React嗎(下)Flux與Vuex的差異以及Webpack的工作原理