subversion(以下簡稱svn)是近年來崛起的版本管理工具,是cvs的接班人,svn服務器有2種運行方式:獨立服務器和藉助apache,這裏我們採用獨立服務器運行方式。svn存儲版本數據也有2種方式:BDB和FSFS。因爲BDB方式在服務器中斷時,有可能鎖住數據,所以還是FSFS方式更安全一點,這裏我們也採用FSFS方式來存儲數據。
1.svn服務器安裝
操作系統: Redhat Linux AS4.4
安裝包獲取:
http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz
http: //subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz。
編譯:
以root用戶登錄
將subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz傳到服務器。
tar -xfvz subversion-1.4.0.tar.gz
tar -xfvz subversion-deps-1.4.0.tar.gz
cd subversion-1.4.0
./configure --prefix=/usr/local/subversion --without-berkeley-db
(注:以svnserve方式運行,不加apache編譯參數。以fsfs格式存儲版本庫,不編譯berkeley-db)
make
make install
vi /etc/profile,在/etc/profile最後加入:
PATH=$PATH: /usr/local/subversion/bin
export PATH
測試:
svnserve –version
如果顯示如下,安裝成功:
svnserve, version 1.4.0 (r21228)
2.svn配置
建立版本庫目錄,
mkdir -p /opt/svndata/sina
建立版本庫:
svnadmin create /opt/svndata/sina
修改版本庫配置文件:
vi /opt/svndata/sina/conf/svnserve.conf
內容修改爲:
[general]
anon-access = none
auth-access = write
password-db = /opt/svn/conf/pwd.conf
authz-db = /opt/svn/conf/authz.conf
realm = sina
配置允許訪問的用戶:
vi /opt/svn/conf/pwd.conf
內容修改爲:
[users]
admin = svn_admin
php=php123
flash=flash123
aaa = 123
bbb = 456
其中,[users]是必須的,下面是列出要訪問svn的用戶,每個用戶一行。Admin是SVN系統管理員,php和flash是組管理員,aaa是php組的成員,bbb是flash組的成
員。
配置用戶訪問權限:
vi /opt/svn/conf/authz.conf
內容修改爲:
[groups]
g_admin = admin
g_php = php
g_flash = flash
u_web = aaa
u_flash = bbb
[/]
@g_admin = rw
* = r
[sina:/source/php]
@g_admin = rw
@g_php = rw
aaa = r
* =
[sina:/source/flash]
@g_admin = rw
@g_flash = rw
bbb = r
* =
注意:
* 權限配置文件中出現的用戶名必須已在用戶配置文件中定義。
* 對權限配置文件的修改立即生效,不必重啓svn。
詳細權限參照authz.conf。
3.啓動svn
建立啓動svn的用戶:
useradd svn
passwd svn
根據提示爲用戶svn設置密碼
允許用戶svn訪問版本庫:
chown –R svn:svn /opt/svndata
chown –R svn:svn /opt/data
由於SVN沒有提供直接啓動該服務的腳本,所以我們自己寫個shell腳本來實現:
more /etc/init.d/svn
#!/bin/bash
# description: Svnserve auto start-stop script.
# chkconfig: - 85 15
SVN_HOME=/usr/local/subversion/bin
SVN_OWNER=svn
if [ ! -f "$SVN_HOME/svnserve" ]
then
echo "svnserver startup: cannot start"
exit
fi
case "$1" in
'start')
su - $SVN_OWNER -c "$SVN_HOME/svnserve -d -r /opt/svndata"
;;
'stop')
su - $SVN_OWNER -c "killall svnserve"
;;
'restart')
su - $SVN_OWNER -c "killall svnserve"
su - $SVN_OWNER -c "$SVN_HOME/svnserve -d -r /opt/svndata"
;;
Esac
Chkconfig –-add svn
Chkconfig –level 3 svn on
Service svn start|stop|restart
檢查服務是否啓動:
ps –ef|grep svnserve
如果顯示如下,即爲啓動成功:
root 3484 1 0 Dec17 ? 00:00:00 /usr/local/subverion/bin/svnserve -d -r /opt/svndata
4.svn備份
由於svn提供了自己的命令用於svn數據的備份,這樣就方便很多。
#!/bin/bash
# Program:
# This program is subversion data backup script
# History:
# 2007/11/20 chentao 1.1
#---------------------------------------------------------------
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
LogFile=/var/backup/svnbak.log
DATE=`date +%Y%m%d`
BakDir=/var/backup
ProjectLst=/opt/svn/conf/project.lst
SvnDir=/opt/svndata
SVNADMIN=/usr/local/subversion/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 czvf $dumpfile $destdir > /dev/null
rm -fr $project
echo "backup $project done into $dumpfile ">>$LogFile
fi
done
echo "svn backup end at $(date +"%y-%m-%d %H:%M:%S")" >> $LogFile
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
注:
1.配置項前面不能有空格,否則會這種報錯
Error * /opt/svndata/test/conf/svnserve.conf:12: Option expected
2.anon-access = read,會有報這個錯
Error * Authorization failed
3.password-db,authz-db使用的文件可以加上路徑,這樣多個版本庫可以共用一個認證庫
4.權限配置文件中出現的用戶名必須已在用戶配置文件中定義。
5.對權限配置文件的修改立即生效,不必重啓svn。
6.權限主體可以是用戶組、用戶或*,用戶組在前面加@,*表示全部用戶。權限可以是w、r、wr和空,空表示沒有任何權限
7.編譯時候如果報錯: checking APR version... 0.9.4 wanted regexes are 0\.9\.[7-9] 0\.9\.1[0-9] 1\. configure: error: invalid apr version found
提示api的版本不夠,是因爲它使用了系統自帶的apr版本,所以我們修改編譯參數,指定apr版本,可以通過安裝apr包,或者通過安裝新版本的apache(2.2.6),因爲新版本的apache裏面帶的有apr