【1.業(yè)務需求】 經(jīng)過前面的SVN搭建,權(quán)限配置和強制寫日志的工作之后,今天的任務是把原來其它分散的各個版本庫統(tǒng)一遷移到新的版本庫,集中統(tǒng)一管理。要求不改變原有的版本庫的內(nèi)容和版本號。 【2.基本思路】 要實現(xiàn)版本庫的無縫遷移,必須通過以下3個步驟: ①導出舊的版本庫 ②導入新的版本庫 ③通知客戶端切換版本庫分支 首先來看第一步:導出舊的版本庫。我們知道SVN提供了check out命令和export命令簽出,導出版本庫中的內(nèi)容。對于版本庫內(nèi)容比較少的情況這種方法可以采用。但是如果版本庫中內(nèi)容比較多,那么這種方法就顯得很笨重了,而且還涉及到版本號改變的問題。所以首先擯棄這種做法。 我們知道Oracle提供了export/import命令來將數(shù)據(jù)庫導出成一個二進制文件,然后導入。同樣的SVN也提供了一對命令:dump和load。不同的是這兩個命令導出的是文本內(nèi)容(肉眼可以讀懂)。而且還有一次性導出和增量導出,單版本導出與多版本導出等多種選擇操作,就是這個了。 其次我們來看“通知客戶端切換版本庫分支”。在我們完成服務器端的版本遷移之后,必須通知客戶端運行切換分支的命令,否則客戶端的提交還是提交到舊的版本庫去。SVN也為我們準備了這樣的命令:svn switch。 【3.相關(guān)命令】 首先我們來看一下SVN的dump和load命令 ①svnadmin dump命令語法 svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental] svnadmin dump命令用于導出整個Repository或Repository下的某個范圍的修訂版本。REPOS_PATH是版本庫的路徑,[-r LOWER[:UPPER]]用于指定導出的修訂版本范圍,由參數(shù)-r和兩個用:號隔開阿拉伯數(shù)字組成。例如:-r 0:50表示導出才版本0到版本50之間的所有修訂版,-r是revision的縮寫。 而另一個關(guān)鍵參數(shù)是--incremental。它使用增量方式來導出版本,即每次都只導出自上一個版本以來的修改。這樣的好處是第一:可以把一個大的文件切分成若干個小的文件。第二:在版本庫已經(jīng)存在的情況下,我們只需要每次導出修改的部分,不需要每次都導出整個版本庫的內(nèi)容。甚至可以通過hook腳本每天晚上自動將當天的修改dump出來做備份用。 ②svnadmin load命令語法 svnadmin load REPOS_PATH svnadmin load命令用于從標準輸入流/其它流中導入版本庫,REPOS_PATH是要導入的目標版本庫。 ③dump和load的輸出/入重定向 svnadmin dump myrepos > dumpfile svnadmin load newrepos < dumpfile 默認情況下dump和load命令分別輸出到默認輸出設備(屏幕)和從默認輸入設備(鍵盤)導入。但我們也可以把輸出流/輸入流重定向。例如上面的第一個命令,使用重定向符>把屏幕的輸出定向當前目錄下的dumpfile,而第二個命令從當前目錄下的dumpfile文件導入。 上面的命令使用起來已經(jīng)很方便了,那么還有沒有更加方便的用法呢?當然有!就是使用管道命令把兩個命令合二為一。 svnadmin dump myrepos | svnadmin load newrepos ④svn switch命令語法 svn switch URL [PATH] switch --relocate FROM TO [PATH] svn switch命令用于更新工作副本的URL。意即指向新的版本庫位置。首先要注意的一點是我們即可以將整個工作副本指向新的URL,也可將工作副本下的某個目錄指向新的URL。 另外一個重要的參數(shù)就是--relocate。這個參數(shù)是否使用對于結(jié)果如何有很大影響,使用不當甚至可能會造成版本庫不可用。其中有兩條重要的規(guī)則: A.假如工作副本只是映射到同一個版本庫內(nèi)的不同位置,那么使用svn switch即可 B.假如工作副本已是映射到不同的版本庫,那么必須使用svn switch --relocate 上面第二條規(guī)則通常發(fā)生在我們需要將整個版本庫遷移到另外一臺機,或者同一臺機的不同版本庫時。這個時候使用--relocate會刷新原有工作副本中每個文件的URL頭部。 【4.示例操作】 好了,下面我們來看如何執(zhí)行版本庫的遷移工作。 ①查看當前舊版本庫最新的版本號是多少 C:\peng\Other>svnlook youngest newRepo 161 ②分批增量導出版本庫內(nèi)容 C:\peng\Other>svnadmin dump newRepo -r 0:50 > dumpfile1 * Dumped revision 0. * Dumped revision 1. * Dumped revision 2. * Dumped revision 3. 導出第一個文件,版本號從0到50的修訂版本 C:\peng\Other>svnadmin dump newRepo -r 51:100 --incremental > dumpfile2 * Dumped revision 51. * Dumped revision 52. * Dumped revision 53. * Dumped revision 54. * Dumped revision 55. 導出第二個文件,版本號從51到100的修訂版本 C:\peng\Other>svnadmin dump newRepo -r 101:161 --incremental > dumpfile3 * Dumped revision 101. * Dumped revision 102. * Dumped revision 103. * Dumped revision 104. * Dumped revision 105. 請注意我們上面三個命令中第2,3個命令多了一個--incremental的參數(shù),這就是采用了增量的方式導出,下面我們一次按照順序?qū)?br /> ③分批導入版本庫文件 C:\peng\Other>svnadmin load newRepo2 < dumpfile1 <<< 開始新的事務,基于最初的修訂版 1 * 正在添加路徑:a done. ------- 提交后的修訂版 1 >>> <<< 開始新的事務,基于最初的修訂版 2 * 正在刪除路徑:a done. 首先導入dumpfile1,然后是dumpfile2,dumpfile3 C:\peng\Other>svnadmin load newRepo2 < dumpfile2 <<< 開始新的事務,基于最初的修訂版 50 * 正在添加路徑:branches done. ------- 提交新修訂版 12 (從原始修訂版 50 裝載) >>> <<< 開始新的事務,基于最初的修訂版 51 * 正在刪除路徑:branches done. ------- 提交新修訂版 13 (從原始修訂版 51 裝載) >>> 導入文件dumpfile2。依次類推dumpfile3。 如果我們前面不使用--incremental方式導出,此處分批導入三個dump文件,則會提示錯誤:版本庫文件已經(jīng)存在。 ④客戶端切換工作副本URL C:\peng\Other>svnserve -d -r c:\peng\other 首先我們把SVN服務的根目錄指向c:\peng\other目錄,在這個目錄下有兩個repository,其中一個名為newRepo,另外一個名為呢wRepo2。 C:\peng\Other>dir Volume in drive C is ESOE_W2K Volume Serial Number is BC1B-22E6 Directory of C:\peng\Other 2008-12-26 15:10 <DIR> . 2008-12-26 15:10 <DIR> .. 2008-12-23 10:04 <DIR> Backup 2008-12-26 14:21 45,578 dumpfile1 2008-12-26 14:22 39,567 dumpfile2 2008-12-26 14:23 55,740 dumpfile3 2008-12-15 09:08 <DIR> newRepo 2008-12-26 14:20 <DIR> newRepo2 2008-12-26 15:25 <DIR> ps 2008-12-24 15:11 <DIR> Toolbar 3 File(s) 140,885 bytes 7 Dir(s) 2,668,414,976 bytes free C:\peng\Other> 首先我們從newRepo這個版本庫中check out出一個子目錄ps C:\Documents and Settings\qlinpen.E0015609D6309>svn checkout svn://localhost/newRepo/ps c:/peng/other/ps A C:\peng\Other\ps\ps.txt 取出修訂版 170。 現(xiàn)在該工作副本已經(jīng)和:svn://localhost/newRepo/ps發(fā)生了映射關(guān)系。我們可以使用svnlook info來顯示這個工作副本的一般信息 C:\peng\Other>cd ps C:\peng\Other\ps>svn info 路徑:. 地址(URL):svn://localhost/newRepo/ps Repository Root: svn://localhost/newRepo 檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078 修訂版:170 節(jié)點種類:目錄 調(diào)度:正常 最后修改的作者:admin 最后修改的修訂版:170 最后修改的時間: 2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008) 輸出信息中明確地指出ps目錄指向了svn://localhost/newRepo/ps。下面我們來把它指向另一個repository下的同名位置:svn://localhost/newRepo2/ps。 C:\peng\Other\ps>svn switch --relocate svn://localhost/newRepo/ps svn://localhost/newRepo2/ps C:\peng\Other\ps> 經(jīng)過上面的切換后,再次使用svnlook info輸出一般信息,發(fā)現(xiàn)URL已經(jīng)被成功切換過來了 C:\peng\Other\ps>svn info 路徑:. 地址(URL):svn://localhost/newRepo2/ps Repository Root: svn://localhost/newRepo2 檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078 修訂版:170 節(jié)點種類:目錄 調(diào)度:正常 最后修改的作者:admin 最后修改的修訂版:170 最后修改的時間: 2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008) 我們嘗試著在ps目錄下修改文件ps.txt為ps.doc,然后提交看看會提交到那個repos去? C:\peng\Other\ps>svn list svn://localhost/newRepo/ps ps.txt C:\peng\Other\ps>svn list svn://localhost/newRepo2/ps ps.doc C:\peng\Other\ps> 很明顯現(xiàn)在的提交全部都去到新的位置了!切換成功。 ------------------------------------------------------------- 生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
請注意我們上面三個命令中第2,3個命令多了一個--incremental的參數(shù),這就是采用了增量的方式導出,下面我們一次按照順序?qū)?br /> ③分批導入版本庫文件