前言
在Git流行起來之前,SVN是一個比較火爆的集中式的版本控制工具。但是Git作為分布式的版本控制工具,它在管理、使用等方面都比SVN要好,越來越多的公司、開發(fā)人員開始使用Git來替代SVN。這就涉及到歷史代碼遷移問題。當(dāng)然最原始的方法就是把代碼手動下載下來,然后手動創(chuàng)建Git倉庫,再把代碼push上去。這樣做不僅耗費(fèi)時間而且對于一些有用的信息如:原先SVN中的commit紀(jì)錄等就沒有了。今天借著遷移部門之前系統(tǒng)代碼的機(jī)會,對整個過程進(jìn)行總結(jié)。
需要了解的背景知識
由于之前一直使用的是Git,沒有接觸過SVN,所以對于SVN并不是很了解,尤其是一些基礎(chǔ)的術(shù)語的了解。也正是因為這個原因讓我在往Git上遷移代碼的時候遇到了一些麻煩,甚至一度卡在那里,不知道該怎么辦了。
-
下面簡單介紹一下SVN以及一些基礎(chǔ)的術(shù)語:
SVN的基本工作原理是在一臺服務(wù)器上建立一個代碼倉庫,在這個倉庫里面可以存放不同項目的源代碼,每個用戶、開發(fā)人員在使用代碼倉庫之前需要先把代碼倉庫里面的代碼下載到本地(Checkout),然后用戶可以在本地對代碼進(jìn)行修改,最后用svn命令進(jìn)行提交(Commit)。整個流程跟Git的使用相差不多,只是使用的命令不同。其中剛剛介紹的創(chuàng)建代碼倉庫的服務(wù)器稱為SVN服務(wù)器,用戶、開發(fā)人員使用SVN客戶端與SVN服務(wù)器進(jìn)行交互。
- SVN服務(wù)器:一般分為兩大種類,一類是獨(dú)立的服務(wù)器,它使用SVN協(xié)議,另一類的是借助Apache服務(wù)器來實現(xiàn)的,它使用HTTP協(xié)議
- SVN客戶端:一般分為命令行和圖形化工具兩大類,常用的圖形化工具有TortoiseSVN
-
SVN基本命令:
服務(wù)器端(管理員使用的):svnadmin、 svnserve
客戶端(開發(fā)人員使用的):svn
-
SVN目錄
/trunk:開發(fā)主線,相當(dāng)于Git中的Master分支。
/branches:支線副本,相當(dāng)于Git中的其余分支。
/tags:標(biāo)簽,與Git中的標(biāo)簽一樣。
一般的所有的開發(fā)工作都是基于trunk進(jìn)行的,當(dāng)一個版本開發(fā)完成,或者開發(fā)到一定段落(開發(fā)、測試、文檔、制作安裝程序、打包等結(jié)束后),代碼基本上就處于一個穩(wěn)定的狀態(tài),這是就會將代碼打上tag,當(dāng)下一個版本需要進(jìn)行開發(fā)的時候,還會在trunk進(jìn)行開發(fā)。但是此時如果發(fā)現(xiàn)了上一個已發(fā)行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在開發(fā)的版本(Developing Version)無法滿足時間要求,這時候就需要在上一個版本上進(jìn)行修改了。解決方法是基于發(fā)行版對應(yīng)的tag,做相應(yīng)的分支(branch)進(jìn)行開發(fā)。
從SVN到Git
首先需要在本地安裝SVN客戶端,這里由于Mac本身就支持SVN(可以在命令行下使用”svn —version"進(jìn)行檢測),所以我使用的是命令行的形式。若是在Windows環(huán)境下也可以下載命令行或者圖形化的客戶端。
-
創(chuàng)建一個文件夾,使用checkout命令,從SVN服務(wù)器下載代碼到本地
Paste_Image.png - 使用命令獲取SVN用戶信息,然后創(chuàng)建映射文件將SVN用戶與Git用戶進(jìn)行映射
將這個SVN用戶與Git用戶進(jìn)行映射文件保存為txt格式,命名為authors.txt
3.使用git svn clone 命令從SVN服務(wù)器取回代碼,并在本地創(chuàng)建Git倉庫,同時使用之前創(chuàng)建的用戶映射文件
這里使用git svn clone的語法為:
- 如果SVN倉庫為不標(biāo)準(zhǔn)的倉庫(沒有trunk、branches、tags)使用:
git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors-file=authors.txt <svn-repo>/<project> <git-repo-name>
- 如果SVN為標(biāo)準(zhǔn)倉庫:
git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit
4.將通過git svn clone
獲得倉庫,使用git clone
當(dāng)前目錄 目的目錄**” 命令克隆到本地其他地方,使用git remote rm origin
去除倉庫的上游
5.使用命令git remote add origin xxxxx(git倉庫)
將這個遠(yuǎn)程倉庫添加到本地倉庫的上游
6.使用命令git push origin master
提交代碼
至此大功告成,而且轉(zhuǎn)換的Git倉庫還保留著原先SVN中開發(fā)人員的提交紀(jì)錄。