版本控制最關鍵的一件事是保證資料的安全性,不能因為磁碟損壞,程式故障造成庫的無法挽回的錯誤,為此必需制定較完備的備份策略.在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的同步