天天看點

CVS遷移到SVN解決方案之svn-importor

最近有一個case,就是要将代碼庫從原先的cvs伺服器,遷移到svn伺服器。

原先使用過cvs2svn,但需要安裝Python的支援,感覺不那麼友善。 發現原來還有另一個強大的工具,就是 SVN Importer。

SVN Importer不但支援cvs to svn, 而且還支援cvsrcs、pvcs、vss、cc、mks等轉移到svn伺服器。 此外, SVN Import是純java編寫的小軟體,隻要你機子上有jdk, 那就可以直接使用了。

SVN Importer有兩種方案來遷移CVS的版本庫。

1. 使用SVN Importer内置的Java CVS通過pserver協定來導出資料;

2. 使用RCS直接從CVS版本庫檔案系統中導出資料。

資料遷移過程分三步。和其它工具類似,都是讀資料、生成DUMP、導入DUMP。整個過程及參數配置都在文檔裡寫得比較詳細。

SVN Importer的安裝和運作很簡單。下載下傳之後解壓到某個目錄即完成安裝。安裝目錄下有一個run.bat檔案。運作run.bat的時候要帶2-3個參數。第一個參數是操作模式;第二個參數是配置檔案;第三個參數指定一個日期,表示僅遷移這個日期之後的資料。

SVN Importer有3種操作模式:完整、增量和清單。完整模式用于将源VCS的版本庫資料全部導出;增量模式則用在第一次的完整模式之後,導出新增加的資料;清單模式隻将要導出的資料顯示出來,不實際導出。

至于配置檔案,在安裝目錄下已經有一個config.properties作為示例。使用SVN Importer的時候隻需要複制一份這個檔案,再稍做修改即可。

配置檔案中主要分四個部分:

第一部分,正常配置,這裡選擇源版本庫,設定臨時目錄,以及中間檔案的位置等。重要的一些設定如下:

srcprovider=源VCS,可以是cvs、cvsrcs、pvcs、vss、cc、mks等

import_dump_into_svn=yes或no,是否在生成DUMP檔案之後立即導入SVN中(選否則不導入)

full.dump.file=完整模式時生成的DUMP檔案路徑

incr.dump.file=增量模式時生成的DUMP檔案路徑

incr.history.file=曆史檔案路徑,這個檔案在第一次完整模式時生成,以後使用增量模式時需要讀取其内容。

第二部分是SVN相關的設定,主要包括svnadmin的位置和版本庫中的一些設定。關鍵設定如下:

trunk_path=/trunk,主分支所在目錄

branches_path=/branches,分支目錄

tags_path=/tags,标簽儲存目錄

svnimporter_user_name=SvnImporter,建立版本庫的使用者名

svnadmin.executable=svnadmin的路徑

svnadmin.repository_path=産生的SVN版本庫路徑

svnadmin.parent_dir=将資料導入版本庫裡的哪們目錄。想設定為根目錄,将這個值設定為.(點号)即可;或者可以設定成工程名。 trunk、branches和tags都會産生在這個目錄之下。

第三部分是對所選擇的源VCS進行配置,用于導出資料。因為工作中隻是為了遷移CVS的資料,是以隻用到了導出CVS的兩種配置。稍後說明。

第四部分是對日志檔案的一些配置。

第一次是直接使用的srcprovider=cvs,通過pserver來導出資料。想對于cvsrcs來說,這個速度要稍慢一些,但是它不需要安裝第三方的工具,隻需要使用内置的Java CVS就行,是以用來導出小項目還是比較好的。而且配置也比較簡單,主要就是CVSROOT中的一些配置。

cvs.class=org.polarion.svnimporter.cvsprovider.CvsProvider

cvs.username=通路CVS版本庫的使用者名

cvs.password=上面使用者名登入CVS版本庫時的密碼

cvs.hostname=主機位址

cvs.repository=CVSROOT目錄

cvs.modulename=要導出的工程(或目錄)

cvs.tempdir=存放臨時檔案的目錄

後來考慮到CVS裡面的工程都比較大,而且可能需要直接從版本庫檔案導出資料(不是通過用戶端去通路CVS版本庫,而直接通路版庫的檔案),是以又嘗試了使用srcprovider=cvsrcs。這個情況下要用GNU RCS來導出CVS資料,是以需要安裝RCS(http://www.gnu.org/software/rcs/rcs.html)。

RCS目前最新是5.7版,分3個包下載下傳,分别是rcs57pc1、rcs57pc2和rcs57pc3。這3個檔案包分别是編譯好的二進制檔案、文檔和源碼。其實隻需要下載下傳第一個包就行了,需要用到的也隻是bin目錄下的rlog和co兩個指令而已。相關配置大概有:

cvsrcs.class=org.polarion.svnimporter.cvsprovider.CvsRcsProvider

cvsrcs.repository_path=CVS版庫檔案目錄

cvsrcs.rlog_command=rlog指令的路徑

cvsrcs.co_command=co指令的路徑

cvsrcs.tempdir=儲存臨時檔案的目錄

配置好之後,一開始每次運作都失敗,看日志也不知所雲。大概是說某個檔案沒找到。于是決定手工運作rlog.exe來試試看。

rlog.exe cvsroot\common\common.sln,v

結果報錯

rlog: cvsroot\common\RCS/common.sln,v: No such file or directory

很奇怪,為什麼rlog非要塞一個RCS/目錄進去呢?後來在論壇上查到,使用cvsrcs的時候,需要設定環境變量RCSINIT=-x,v/,雖然看不明白是啥意思,不過設定了這個環境變量之後SVN Importer跑成功了。

為了搞明白這個設定,是以隻好去下載下傳了RCS的文檔來檢視。在文檔裡搜尋-x,v/,發現原來是配置RCS處理的檔案字尾。未設定的情況下會去RCS子目錄中查找檔案。-x是設定字尾的參數,v是CVS版本庫檔案的字尾,而/是分隔符,其後沒有東西表示為空。是以這個設定是兼顧,v檔案和RCS/兩種情況。

最後,由于CVS不能記錄目錄的更改曆史,最後導入到SVN後,從HEAD裡取出來的資料中有許多原來删除掉的目錄和檔案。感覺多冒出來的那些都應該是些空目錄才對,搞不明白為什麼還有一些删除掉的檔案也冒出來了,還不太好找規律。是以,隻好先對照從CVS裡Checkout出來的最新版,删除掉多餘的目錄和檔案之後,再Checkin到SVN中,這才算完成遷移過程。