Windows下SVN的備份方案

來源:互聯網
上載者:User

版本控制最關鍵的一件事是保證資料的安全性,不能因為磁碟損壞,程式故障造成庫的無法挽回的錯誤,為此必需制定較完備的備份策略.在subversion中,我們有三種備份方式:完全備份,增量備份和同步版本庫.

 

1,完全備份:

最常見和簡單的備份就是直接使用拷貝命令,將版本庫目錄拷貝到備份目錄上,就可以了.但是這樣不是很安全的方式,因為如果在拷貝時版本庫發生變化,將會造馬備份的結果不夠準確,失去備份的作用,為此xubversion 提供了"svnadmin hotcopy"的命令,可以防止這種問題.

比如有如下的版本庫:

D:/svnroot
├─project1
│     ├─conf
│     ├─dav
│     ├─db
│     │     ├─revprops
│     │     ├─revs
│     │     └─transactions
│     ├─hooks
│     └─locks
└─project2
       ├─conf
       ├─dav
       ├─db
       │     ├─revprops
       │     ├─revs
       │     └─transactions
       ├─hooks
└─locks

如果要把project1備份到D:/svnrootbackup目錄下,只需要運行:svnadmin hotcopy d:/svnroot/project1 d:/svnrootbackup/project1

ps:如果我們目錄下有很多版本庫,需要為每個版本庫寫這樣一條語句備份,必需想辦法最佳化這個過程.為此,建立以下的2個bat檔案.

simplebackup.bat:
@echo 正在備份版本庫%1......
@%SVN_HOME%/bin/svnadmin hotcopy %1 %BACKUP_DIRECTORY%/%2
@echo 版本庫%1成功備份到了%2!

backup.bat:
echo off
rem Subversion的安裝目錄
set SVN_HOME="D:/Subversion"
rem 所有版本庫的父目錄
set SVN_ROOT=D:/svnroot
rem 備份的目錄
set BACKUP_SVN_ROOT=D:/svnrootbak
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%/%date:~0,10%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 建立備份目錄%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
rem 驗證目錄是否為版本庫,如果是則取出名稱備份
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf" %SVN_ROOT%/simplebackup.bat "%%~fI" %%~nI
goto end
:checkBack
echo 備份目錄%BACKUP_DIRECTORY%已經存在,請清空。
goto end
:end

使用的時候,只需要修改backup.bat開頭的三個路徑,將兩個指令碼拷貝到"svn_root"下就可以了.根據以上的配置,你只需要運行backup.bat.就可以把"svn_root"下的版本庫都備份到"backup_svn_root"裡,並且存放在備份所在的目錄裡.

2,增量備份.

儘管完全備份非常簡單,但是也是有代價的,當版本庫非常巨大的時候,經常進行完全備份是不現實的,也並不必要,但是一量版本庫在備份之間發生問題該如何呢,我們就用到了增量備份.

增量備份通常要與完全備份結合使用,記錄著每次subversion提交的變化,然後在需要恢複時能夠回到最新的可用狀態.

我拉使用的是,svnadmin dump 命令進行增量的備份,使用方法是:

svnadmin dump d:/sourcecode/project1 --revision 15 --incremental > d:/sourcecode/dumpfile

上面的命令實現了對修訂版本15進行增量的備份,其中的輸出檔案dumpfile只儲存了修訂版本15更改的內容

恢複增量備份時,使用方法是:
svnadmin load d:/sourcecode/project1 < d:/sourcecode/dumpfile
上面的命令實現了對增量備份檔案恢複到版本庫project1中

使用鉤子指令碼Hooks實現自動增量備份:
1) 建立deltabackup.bat檔案,內容為:
@echo 正在備份版本庫%2......
%SVN_HOME%/bin/svnadmin dump %SVN_ROOT%/%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%/%1.dump
@echo 版本庫%2成功備份到了%3!
2) 建立post-commit.bat檔案,內容為:
echo off
set SVN_HOME="C:/Program Files/Subversion"
set SVN_ROOT=D:/svnroot
set UNIX_SVN_ROOT=D:/svnroot
set DELTA_BACKUP_SVN_ROOT=D:/svnrootbak/delta
set LOG_FILE=%1/backup.log
echo backup revision %2 >> %LOG_FILE%
for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%/%%~nI/hooks/deltaBackup.bat %%~nI %2
goto end
:end
3) 把以上兩個指令碼可以直接拷貝到版本庫的hooks目錄下,就可以實現版本庫的自動備份。

3. 同步版本庫:
同步機制,可以實現一個版本庫同另一個版本庫的同步(但好像只是單向的),我們可以用來實現版本庫的備份或鏡像。
例如:同步版本庫d:/sourcecode/project1
1) 建立一個空的版本庫project2
運行命令:
svnadmin create d:/sourcecode/project2

2) 為新的版本庫建立pre-revprop-change鉤子指令碼(hook scrīpt)
在d:/sourcecode/project2/hooks目錄下建立一個空的pre-revprop-change.bat檔案

3) 初始化版本庫
運行命令:
svnsync init file:///d:/sourcecode/project2 file:///d:/sourcecode/project1

4) 同步版本庫
運行命令:
svnsync sync file:///d:/sourcecode/project2
 
5) 至此,版本庫同步已經完成。
在使用新的版本庫之前,還需要根據需要對版本庫的存取權限等進行配置。

使用鉤子指令碼Hooks實現自動同步:
1) 建立post-commit.bat檔案,內容為:
echo off
set SVN_HOME="D:/Subversion"
%SVN_HOME%/bin/svnsync sync     --non-interactive svn://localhost/project2
2) 把post-commit.bat檔案放到版本庫project1下的hooks目錄下,這樣project1每次提交,都會引起project2的同步

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.