倉庫中版本的備份及還原形式主要有兩種:
方式一:直接備份倉庫整個資料夾(全部版本),重灌svn程式後直接還原過去。
方式二:通過svn命令列備份和還原指定版本號的資料
全備份:使用svnadmin hotcopy或svnsync來做,例:
svnadmin hotcopy path/to/repository path/to/backup –clean-logs
增量備份:使用svnadmin dump的–incremental選項來實現
svnadmin dump 版本庫路徑及名稱 –revision 上次匯出的版本號:到本次要匯出到的版本號 –incremental > 匯出的命名
還原版本:svnadmin load 要恢復的版本庫路徑及名稱 < 匯出的命名
svnadmin hotcopy path/to/repository path/to/backup –clean-logs
一個技巧:如果你有一個較大的Subsersion版本庫而你又想用最少的空間來將它備份下來,用這個命令(請將/repo替換成你的版本庫路徑)吧:
svnadmin dump –deltas /repo |bzip2 |tee dump.bz2 | md5sum >dump.md5
分步解釋:最重要的一步是 -deltas,將消耗更多的CPU資源,但擁有更有效的差異儲存辦法。
bzip2壓縮方案比gzip慢,但換來的更好的壓縮率。
更有趣的是,tee方法將壓縮的資料流轉向到檔案dump.bz2,同時將其輸出到標準輸出,後者有轉向給了MD5摘要計算工具。
要恢復這個版本庫,檢查校驗值(md5sum建立的),建立一個空的版本庫,恢復備份:
md5sum -c dump.md5 <dump.bz2
svnadmin create newrepo
bzcat dump.bz2 | svnadmin load newrepo
請享受壓縮後用MD5校驗的備份吧,最後別忘記將dump.md5和dump.bz2儲存到真正安全的地方!
http://www.linuxpf.com.cn/bbs/viewthread.php?tid=304&extra=page%3D1 用指令碼實現svn備份2008-04-17 18:09
文章出於:http://hi.baidu.com/zhangwf/blog/item/f94ca8518a5aa38a8d54305b.html
vi baksvn
#!/bin/bash
# Program:
# This program is subversion data backup script
# History:
# 2008/04/17 zwf 1.0
#---------------------------------------------------------------
LogFile=/var/backup/svnbak.log
DATE=`date +%Y%m%d`
BakDir=/var/backup
ProjectLst=/var/backup/conf/project.lst
SvnDir=/home/svn
SVNADMIN=/usr/local/bin/svnadmin
echo "svn backup start at $(date +"%y-%m-%d %H:%M:%S")" >> $LogFile
echo "------------------------------------------------" >> $LogFile
cd $BakDir
PROJECTLIST=`cat $ProjectLst`
for project in $PROJECTLIST
do
projectdata=$SvnDir/$project
destdir=$BakDir/$project
dumpfile=$DATE.$project.tgz
if [ -f $BakDir/$dumpfile ]
then
echo "backup file have exist!" >>$LogFile
else
$SVNADMIN hotcopy $projectdata $destdir --clean-logs
tar zcvf $dumpfile $project > /dev/null
rm -fr $project
echo "backup $project done into $dumpfile ">>$LogFile
fi
oldfile="$BakDir/"$(date +%Y%m%d --date='2 days ago').$project.tgz
if [ -f $oldfile ]
then
rm -f $oldfile >> $LogFile 2>&1
echo "[$oldfile],Delete Old File Success!" >> $LogFile
else
echo "[$oldfile],No Old Backup File!" >> $LogFile
fi
echo " " >> $LogFile
done
echo "------------------------------------------------" >> $LogFile
echo "svn backup end at $(date +"%y-%m-%d %H:%M:%S")" >> $LogFile
echo " " >> $LogFile
假如你想把svn備份到另外一臺電腦上的話,可以在這段script中再加入下面這段程式碼來利用FTP自動備份到另外的電腦上!!
#The shell script will automatically put the backup file
# from this host to another hosts
#
FTP_SERVER="10.8.1.65"
USERNAME="zwf"
PASSWD="1212"
FTP_QUERY_PATH="/opt/raid/svnbak"
FILE_NAME=`date +%Y%m%d`*.tgz
DELFILE=`date +%Y%m%d --date='2 days ago'`*.tgz
ftp -i -n $FTP_SERVER<<AUTO_FTP
user $USERNAME $PASSWD
passive
binary
cd $FTP_QUERY_PATH
mdelete $DELFILE
mput $FILE_NAME
AUTO_FTP
rm -rf $FILE_NAME
以下文字詳見:《[url=]使用Subversion進行版本控制[/url]》一書 http://www.subversion.org.cn/svnbook/
我們也可以利用Subversion開發小組提供的備份指令碼來對svn倉庫進行備份。Subversion 原始檔分發版本的tools/backup/目錄有一個hot-backup.py檔案。只要給定了版本庫路徑和備份路徑,hot-backup.py— 一個包裹了svnadmin hotcopy但更加智慧的命令—將會執行必要的步驟來備份你的活動的版本庫—不需要你首先禁止公共的版本庫訪問—而且之後會從你的版本庫清理死掉的伯克利日誌檔案。
甚至當你用了一個增量備份時,你也會希望有計劃的執行這個程式。舉個例子,你考慮在你的排程程式(如Unix下的cron)里加入hot-backup.py,或者你喜歡更加細緻的備份解決方案,你可以讓你的post-commit的鉤子指令碼執行hot-backup.py,這樣會導致你的版本庫的每次提交執行一次備份,只要在你的hooks/post-commit指令碼里新增如下程式碼:
(cd /path/to/hook/scripts; ./hot-backup.py ${REPOS} /path/to/backups &)作為結果的備份是一個完全功能的版本庫,當發生嚴重錯誤時可以作為你的活動版本庫的替換。
兩種備份方式都有各自的優點,最簡單的方式是完全備份,將會每次建立版本庫的完美複製品,這意味著如果當你的活動版本庫發生了什麼事情,你可以用備份恢復。但不幸的是,如果你維護多個備份,每個完全的備份會吞噬掉和你的活動版本庫同樣的空間。
順便轉載一段關於鉤子指令碼的敘述
[url=]鉤子指令碼[/url] Hook scripts
掛勾 (hook) 是改動檔案庫時所觸發的程式, 比如當你提交更動前,會先觸發pre-commit,提交更動後,則會觸發post-commit,我們可以利用hook來實現一些自動控制。檔案庫的hook 子目錄中, 預設是放置各個檔案庫掛勾的範本:
post-commit.tmpl
pre-revprop-change.tmpl
post-revprop-change.tmpl
start-commit.tmpl
pre-commit.tmpl
如果要使用這些hook,就必須把它的字尾名.tmpl去掉,拷貝為
post-commit
pre-revprop-change
post-revprop-change
start-commit
pre-commit
這裡主要介紹pre-commit和post-commit(事實上它們就是在特定的情況下被觸發的普通的shell程式,至於shell的內容由使用者自己隨意編寫,但是要保證名稱不能改動)
pre-commit
本掛勾執行的時間為異動完成之後, 送交之前.檔案庫會傳遞兩個自變數給這個程式: 檔案庫的路徑, 以及準備送交的異動名稱. 如果程式傳回一個非零的結束值, 送交會被中止, 而異動會被刪除.
如何應用pre-commit我們不妨舉個例子:
假如有一個專案由Mail Team,Login Team和PHP Team三個Team共同通過SVN系統開發完成。當專案準備釋出的時候, PM人員發現Mail功能方面存在一些 bug,需要Mail Team去修改,為了防止其它Team的人員修改系統,我們可以在任何改動檔案庫的企圖之前用pre-commit去檢查log message資訊,(因為任何更動檔案庫的操作都必須提供log message資訊,PM可以事先輿 Mail Team約定好一個log message),如果輿pre-commit中設定的log message不相符,則不能提交更動。
pre-commit源程式如下:
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep –w "bug1234" > /dev/null || exit 1
exit 0
本例中的log message為”bug1234”,任何人想要提交更動就必須用 –m “bug1234”引數,採用-m “bug123”,-m “bug12345”都會提交失敗。
post-commit
本掛勾執行的時間是在異動送交, 新修訂版被建立之後. 大多數的人用這個掛勾來寄出關於本次送交的電子郵件, 或是建立檔案庫的備份. 檔案庫會傳遞兩個自變數給這個程式: 檔案庫的路徑, 以及新建立的修訂版號. 本程式的結束碼會被忽略.
Subversion 原始碼樹的 tools/hook-script 目錄中包含了一個 commit-email.pl 命令,可以用來寄送包含描述指定送交的電子郵件. 這個郵件包含了更動路徑列表, 該送交所對應的記錄訊息, 使用者, 送交的日期,以及一個以 GNU diff 樣式表示的本次更動差異. 我們可以將這個程式輿post-commit這個hook搭配起來使用來實現檔案庫更動後自動mail給相關人員的功能。
post-commit源程式如下:
#!/bin/sh
REPOS="$1"
REV="$2"
commit-email.pl "$REPOS" "$REV" #####需要指明commit-email.pl的絕對路徑
http://www.cnblogs.com/zealic/archive/2008/11/26/1341784.html SVN 簡單備份與還原 (windows指令碼)
備份 SVN 倉庫是很麻煩的事,而 Coder 通常是很怕麻煩的人,於是 Zealic 就為減少麻煩,花了一點麻煩的時間,寫了兩個麻煩的指令碼,解決了這個麻煩的問題。
1.備份指令碼 DumpAll.bat 。。。@rem 7za a Repos_%VAR_DATE%.7z *.bin 【需要修改為 jar cvf Repos_%VAR_DATE%.jar *.bin】
2.還原指令碼 LoadAll.bat。。。手工解壓.bin檔案後,當前目錄下刪除所有目錄,否則無法執行。