Windows下SVN的備份方案
版本控制最關(guān)鍵的一件事是保證數(shù)據(jù)的安全性,不能因為磁盤損壞,程序故障造成庫的無法挽回的錯誤, 為此必需制定較完備的備份策略.在subversion中,我們有三種備份方式:完全備份,增量備份和同步版本庫.
1,完全備份:
最 常見和簡單的備份就是直接使用拷貝命令,將版本庫目錄拷貝到備份目錄上,就可以了.但是這樣不是很安全的方式,因為如果在拷貝時版本庫發(fā)生變化,將會造馬 備份的結(jié)果不夠準確,失去備份的作用,為此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:如果我們目錄下有很多版本庫,需要為每個版本庫寫這樣一條語句備份,必需想辦法優(yōu)化這個過 程.為此,建立以下的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%已經(jīng)存在,請清空。
goto end
:end
使 用的時候,只需要修改backup.bat開頭的三個路徑,將兩個腳本拷貝到"svn_root"下就可以了.根據(jù)以上的配置,你只需要運行 backup.bat.就可以把"svn_root"下的版本庫都備份到"backup_svn_root"里,并且存放在備份所在的目錄里.
2,增量備份.
盡管完全備份非常簡單,但是也是有代價的,當版本庫非常巨大的時候,經(jīng)常進行完全備份是不現(xiàn)實的, 也并不必要,但是一量版本庫在備份之間發(fā)生問題該如何呢,我們就用到了增量備份.
增量備份通常要與完全備份結(jié)合使用,記錄著每次subversion提交的變化,然后在需要恢復(fù)時 能夠回到最新的可用狀態(tài).
我拉使用的是,svnadmin dump 命令進行增量的備份,使用方法是:
svnadmin dump d:\sourcecode\project1 --revision 15 --incremental > d:\sourcecode\dumpfile
上面的命令實現(xiàn)了對修訂版本15進行增量的備份,其中的輸出文件dumpfile只保存了修訂版本 15更改的內(nèi)容
恢復(fù)增量備份時,使用方法是:
svnadmin load d:\sourcecode\project1 < d:\sourcecode\dumpfile
上面的命令實現(xiàn)了對增量備份文件恢復(fù)到版本庫project1中
使用鉤子腳本Hooks實現(xiàn)自動增量備份:
1) 建立deltabackup.bat文件,內(nèi)容為:
@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文件,內(nèi)容為:
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目錄下,就可以實現(xiàn)版本庫的自動備份。
3. 同步版本庫:
同步機制,可以實現(xiàn)一個版本庫同另一個版本庫的同步(但好像只是單向的),我們可以用來實現(xiàn)版本庫的備份或鏡像。
例如:同步版本庫d:\sourcecode\project1
1) 新建一個空的版本庫project2
運行命令:
svnadmin create d:\sourcecode\project2
2) 為新的版本庫創(chuàng)建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) 至此,版本庫同步已經(jīng)完成。
在使用新的版本庫之前,還需要根據(jù)需要對版本庫的訪問權(quán)限等進行配置。
使用鉤子腳本Hooks實現(xiàn)自動同步:
1) 建立post-commit.bat文件,內(nèi)容為:
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的同步