引:最近正在做版本庫遷移和自動備份,在網上找過一些相關資料,但都比較凌亂,讓人很糾結,相信很多網友會遇到相同的問題,筆者根據自己的整理和實踐結果總結了一套可操作(經過實際驗證)的方案,打算用兩篇博客與大家分享一下,供大家參考。
一、業務目標
1、在不改變原來版本庫的內容和版本號的前提下,把原來分散在多個服務器上的各個版本庫統一遷移到一台服務器上的新版本庫上。
2、實現新版本庫的定時自動備份。
二、相關指令
1、svnadmin dump命令語法
svnadmin dump Repository_Path [-r LOWER[:UPPER]] [--incremental]
(1)svnadmindump命令用於導出整個Repository或Repository下的某個范圍的修訂版本。
(2)參數說明:
Repository_Path是版本庫的路徑,
[-rLOWER[:UPPER]]用於指定導出的修訂版本范圍,由參數-r和兩個用:號隔開阿拉伯數字組成。
例如:-r 0:100表示導出才版本0到版本100之間的所有修訂版,-r是revision的縮寫。
--incremental,它使用增量方式來導出版本,即每次都只導出自上一個版本以來的修改。這樣的好處是第一:可以把一個大的文件切分成若干個小的文件。第二:在版本庫已經存在的情況下,我們只需要每次導出修改的部分,不需要每次都導出整個版本庫的內容。甚至可以通過hook腳本,每天晚上自動將當天的修改dump出來做備份用。
2、svnadmin load命令語法
svnadmin load Repository_Path
(1)svnadminload命令用於從標准輸入流/其它流中導入版本庫,
(2)參數說明:
Repository_Path是要導入的目標版本庫。
3、dump和load的輸出/入重定向
svnadmin dump oldRepository> dumpfile
svnadminload newRepository < dumpfile
默認情況下dump和load命令分別輸出到默認輸出設備(屏幕)和從默認輸入設備(鍵盤)導入。但我們也可以把輸出流/輸入流重定向。例如上面的第一個命令,使用重定向符>把屏幕的輸出定向當前目錄下的dumpfile,而第二個命令從當前目錄下的dumpfile文件導入。
4、把導出和導入合並。
svnadmin dump oldRepository| svnadmin load newRepository
5、過濾器svndumpfilter
用於指定只包括那些項目,不會包括其它的項目
二、遷移版本庫(解決方案示例)
方案1、一次全部遷移。
首先新建三個批處理文檔(新建記事本,后綴改為.bat)
①導出.bat
svnadmin dump oldRepository > dumpfile
②新建版本庫.bat
svnadmin create newRepostitory
③導入.bat
svnadmin load newRepository < dumpfile
步驟:
如果你的SVN裝在C:\program files下,那么:
a、將“導出.bat”放在原庫目錄下,即oldRepository所在目錄下(例如D:\Repositories),雙擊執行,導出版本庫!
b、將“新建版本庫.bat”放在新庫目錄下,即newRepostitory要放的位置(例如E:\Repositories),雙擊執行,新建版本庫!
c、將“導入.bat”放到新庫目錄下(例如剛才的E:\Repositories),雙擊執行,導入版本庫!
如果你的SVN不是裝在上述位置,那么:
這三個批處理文件,要全部放在SVN安裝目錄的Bin目錄下,而且也不能單純的寫文件名就可以了,要寫完整的文件名。
例如svnadmin dump D:\SVN版本庫\oldrepository > D:\dumpfile
說明:上述步驟即實現將oldRepository版本庫無損遷移到newRepository。這里是采用批處理文件的形式,完全可以在命令提示符窗口下,以命令的形式完成上述操作,注意必須在相應的目錄下執行。
方案2、分批增量遷移版本庫。
①查看當前舊版本庫最新的版本號是多少
在命令提示符窗口,打開庫所在目錄,例如:cd D:\Repositories。
執行svnlook youngest oldRepositories
例如返回版本為281
②分批增量導出版本庫內容
D:\Repositories\svnadmin dump oldRepository -r 0:100 > dumpfile1
導出第一個文件,版本號從0到100的修訂版本
D:\Repositories\svnadmin dump oldRepository -r 101:200 --incremental > dumpfile2
導出第二個文件,版本號從101到200的修訂版本
D:\Repositories\svnadmin dump oldRepository -r 201:281 --incremental > dumpfile3
導出第三個文件,版本號從201到281的修訂版本
注:三個命令中第2,3個命令多了一個--incremental的參數,使其采用了增量的方式導出,
③分批導入版本庫文件
注:打開要導入的版本庫所在目錄,例如cd E:\Repositories。
首先導入dumpfile1,然后是dumpfile2,dumpfile3
依次執行
E:\Repositories\svnadmin load newRepository < dumpfile1
E:\Repositories\svnadmin load newRepository < dumpfile2
E:\Repositories\svnadmin load newRepository < dumpfile3
可能會出現的問題,提示錯誤:版本庫文件已經存在。請確認前邊導出時,是否使用了--incremental參數。
說明:這里我們是在命令提示符窗口下進行的。同樣的,我們也可以按照方案1,采用寫批處理文件的方式。
注:要根據自己的svn安裝目錄,和庫目錄寫命令,例如:
C:\Program Files\VisualSVN Server\bin\svnadmin load D:\Repositories\newRepository < E:\dumpfile1
方案3、導出后,在導入時對庫做分庫處理或其它處理操作過濾版本庫歷史。
假設有一個包含三個項目的版本庫oldRepository:Project1,Project2,和 Project3。它們在版本庫中的布局如下:
/
Project1/
trunk/
branches/
tags/
Project2/
trunk/
branches/
tags/
Project3/
trunk/
branches/
tags/
現在要把這三個項目轉移到三個獨立的版本庫中。
①利用上面介紹的方案1導出整個版本庫:
svnadmin dump oldRepository> dumpfile
②將轉儲文件三次送入過濾器,每次僅保留一個頂級目錄,就可以得到三個轉儲文件:
cat dumpfile | svndumpfilter include Project1> 1-dumpfile
cat dumpfile | svndumpfilter include Project2 > 2-dumpfile
cat dumpfile | svndumpfilter include project3 > 3-dumpfile
注:cat是subversion的文檔中,關於svndumpfilter介紹給出的命令,在windows下並沒有,與cat類似的命令是type,可以采用typedumpfile | svndumpfilter include Project1> 1-dumpfile
③這三個轉儲文件中,每個都可以用來創建一個可用的版本庫,不過它們保留了原版本庫的精確路徑結構。
也就是說,雖然項目Project1現在獨占了一個版本庫,但版本庫中還保留着名為Project1的頂級目錄。如果希望trunk、tags和branches這三個目錄直接位於版本庫的根路徑下,你可能需要編輯轉儲文件,調整Node-path和Copyfrom-path頭參數,將路徑Project1/刪除。
同時刪除轉儲數據中創建Project1目錄的部分。一般為如下的一些內容:
Node-path: Project1
Node-action: add
Node-kind: dir
Content-length: 0
注:手工編輯轉儲文件來移除一個頂級目錄時,不要讓編輯器將換行符轉換為本地格式(比如將\r\n轉換為\n),很容易造成轉儲文件失效。
④最后,我們可以采用方案1提供的方法,將三個轉儲文件分別導入:
svnadmin create Project1
svnadmin load Project1< 1-dumpfile
svnadmin create Project2
svnadmin load Project2< 2-dumpfile
svnadmin create Project3
svnadmin load Project3< 3-dumpfile
遷移版本庫的解決方案就先寫到這,下篇博客中,我們將介紹定時自動備份版本庫的解決方案。