SVN版本庫無損遷移與自動備份(一)

來源:互聯網
上載者:User

引:最近正在做版本庫遷移和自動備份,在網上找過一些相關資料,但都比較淩亂,讓人很糾結,相信很多網友會遇到相同的問題,筆者根據自己的整理和實踐結果總結了一套可操作(經過實際驗證)的方案,打算用兩篇部落格與大家分享一下,供大家參考。
 
一、營運目標
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
 
遷移版本庫的解決方案就先寫到這,下篇部落格中,我們將介紹定時自動備份版本庫的解決方案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.