2013年12月6日 星期五


2007/06/14 16:51
以下是有關SVN備份及同步的工作記事 有關SVN的架設及使用請看這一篇


SVN Server端檔案庫備份


svnadmin hotcopy 原始檔案庫路徑 要備份目標路徑

例如

svnadmin hotcopy D:\SVNRoot\Proj1 E:\SVNBack\Proj1

另外 備份目標必須為空目錄
所以備份前需要先刪除舊有資料 或是建立新資料夾
可以使用windows所提供的批此檔及排程來自動備份
批次檔內容例如下方

@echo off

set SVN_BackUp=E:\SVNBackup
set SVN_ROOT=D:\SVNRoot
set SVN_BackUp_Dir=%SVN_BackUp%\%date:~0,4%%date:~5,2%%date:~8,2%

if not exist %SVN_BackUp% mkdir %SVN_BackUp%
if exist %SVN_BackUp_Dir% goto ALREADY_EXIST_DATE
mkdir %SVN_BackUp_Dir%
for /r %SVN_ROOT% %%D in (.) do @if exist "%%D\conf\svnserve.conf" svnadmin hotcopy %%~fD %SVN_BackUp_Dir%\%%~nD
goto END

:ALREADY_EXIST_DATE
echo 目錄%SVN_BackUp_Dir%已存在

:END

將上方內容存檔到D:\SVNRoot\BackUp.bat
並利用Windows排程 每天晚上10點備份

at 22:00 /every:s,m,t,w,th,f,sa "D:\SVNRoot\BackUp.bat"


不過這一個功能僅能本機端使用
可以注意到svnadmin後面的參數給的都是本機端的路徑
所以處理檔案也都不需要經過SVNService


SNV 檔案庫同步

在新版的SVN提供了SVNSYNC的程式 可以達成兩個檔案庫之間的同步
和上方備份不同的是 他可以經由遠端來運作 因此可以備份到不同電腦上
另外在備份之前不需要刪除舊有資料 因為他是同步
Subversion的官網上雖然有文章介紹如何使用
不過是針對Linux的環境下的說明...
那在Windows雖然很類似 不過要作一些修改

首先 要建立同步目標的檔案庫

svnadmin create DestRepository

然後設定DestRepository的Conf檔跟建立一個新的帳號 (例如"SvnSync")
並在來源檔案庫新增一筆一樣的帳號密碼
並且在hooks的目錄下建立一個新的檔案叫
"pre-revprop-change.bat"
檔案內容使用空白即可運作
不過這一個目標檔案庫有一個限制 他不應該被一般使用者Commit資料上去
也就是說應該只有svnsync可以對他作寫入的動作
應此建議將檔案內容修改為下列所述

@echo off

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

if not '%user%'=='SvnSync' goto ERROR_USERNAME
exit 0
:ERROR_USERNAME
echo Only allow user SvnSync. >&2
exit 1 

此動作是檢查使用者帳號是否為SvnSync (大小寫有分)
如果要不分大小寫 請將此行改為

if /I not '%user%'=='SvnSync' goto ERROR_USERNAME


接下來要對此檔案庫做初始化的動作 讓他知道要跟哪個來源作同步

svnsync init --username SvnSync --password XXX 目標檔案庫位址 來源檔案庫位址

這一個命令的目標跟來來源都是使用位址 因此可以使用本地端或是遠端路徑
例如

svnsync init --username SvnSync --password XXX file:///E:/SVNBackup/DestRepository svn://SVNServer/SourceRepository

注意 本地端位置中斜線的方向跟數量

最後就是同步的動作

svnsync sync --username SvnSync --password XXX 目標檔案庫位址

同樣的 我們可以寫一些批次檔來達成自動化的目的
方式是在來源檔案庫的hooks的目錄下 建立一個新檔案叫做
"post-commit.bat"
他會在來源檔案庫接受每一次的Commit之後啟動 內容為下

@echo off
svnsync sync --non-interactive --username SvnSync --password XXX svn://SVNServer2/DestRepository

這邊是備份到跟來源檔案庫不同的Server上
可以依據每個人不同的需求作更動...

結論是 新的1.4版中的svnsync實在很好用
上半段文章看看就好 使用hotcopy的方式實在是太浪費磁碟空間了
不過前提示 要先把伺服器換成1.4版或以後的版本
並且 目標檔案庫必須是使用1.4版以後的svnadmin所建立的

另外可以發現 寫一些批次檔放進hooks目錄中
可以達成蠻多功能的 有興趣可以網路上搜尋一下文章看看

希望此文章對有使用SVN並架設在Windows上的人有一些幫助

update
如有遇到同步失敗, 或是不同Thread同時要進行同步造成鎖定而錯誤
可使用下列指令解決鎖定

svn propdel svn:sync-lock --revprop -r 0 目標檔案庫位址

沒有留言: