倉庫中版本的備份及還原形式主要有兩種:
方式一:直接備份倉庫整個文件夾(所有版本),重裝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的絕對路徑php
http://www.cnblogs.com/zealic/archive/2008/11/26/1341784.html SVN 簡單備份與還原 (windows腳本)html
備份 SVN 倉庫是很麻煩的事,而 Coder 一般是很怕麻煩的人,因而 Zealic 就爲減小麻煩,花了一點麻煩的時間,寫了兩個麻煩的腳本,解決了這個麻煩的問題。linux
1.備份腳本 DumpAll.bat 。。。@rem 7za a Repos_%VAR_DATE%.7z *.bin 【須要修改成 jar cvf Repos_%VAR_DATE%.jar *.bin】shell
2.還原腳本 LoadAll.bat。。。手工解壓.bin文件後,當前目錄下刪除全部目錄,不然沒法運行。windows