使用svnadmin create 創建一個版本庫:
svnadmin create cqzn_server
每個版本庫的目錄下有一個hooks目錄:
# ls /home/svn/cqzn_server/
conf dav db format hooks locks README.txt
在每個版本庫下有hooks文件夾,裏面有很多鉤子程序:
# ls -l hooks/
total 40
-rwxr-xr-x 1 www-data www-data 332 2010-05-30 16:47 post-commit
-rw-r–r– 1 www-data www-data 2000 2010-05-30 15:22 post-commit.tmpl
-rw-r–r– 1 www-data www-data 1663 2010-05-29 23:28 post-lock.tmpl
-rw-r–r– 1 www-data www-data 2322 2010-05-29 23:28 post-revprop-change.tmpl
-rw-r–r– 1 www-data www-data 1592 2010-05-29 23:28 post-unlock.tmpl
-rw-r–r– 1 www-data www-data 3488 2010-05-29 23:28 pre-commit.tmpl
-rw-r–r– 1 www-data www-data 2410 2010-05-29 23:28 pre-lock.tmpl
-rw-r–r– 1 www-data www-data 2796 2010-05-29 23:28 pre-revprop-change.tmpl
-rw-r–r– 1 www-data www-data 2100 2010-05-29 23:28 pre-unlock.tmpl
-rw-r–r– 1 www-data www-data 2830 2010-05-29 23:28 start-commit.tmpl
注:
# start-commit 提交前觸發事務
# pre-commit 提交完成前觸發事務
# post-commit 提交完成時觸發事務
# pre-revprop-change 版本屬性修改前觸發事務
# post-revprop-change 版本屬性修改後觸發事務
在執行commit操作之後會自動執行post-commit這個鉤子程序。
因此可以設置post-commit來自動更新到線上服務器:
操作步驟如下:
1. 新建立一個工作副本。
mkdir /yin/
2、授權:--否則提交會報權限錯誤。
chmod 777 -R /yin/
3、進入該目錄後,checkout出一個副本,用於同步上線上服務器的路徑。
cd /yin/
svn co svn://192.168.1.250/cqzn_server
注:此副本不能爲空:此時該路徑爲:/yin/cqzn_server --後面同步時候所需的路徑
4、設置post-commit腳本以便同步到線上服務器。
cd /home/svn/cqzn_server/hooks
mv post-commit.tmpl post-commit
並且修改這個文件:如下內容
vim post-commit
#Set variable
SVN=/usr/bin/svn
WEB=/yin/cqzn_server
#/yin/這個目錄是上面創建出來做副本同步的目錄。
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_cqzn_server.log
WEBIP="192.168.1.222"
#這個ip是線上web服務器的ip.
export LANG=en_US.UTF-8
$SVN update $WEB --username yinliang --password yinliang
if [ $? == 0 ]
then
echo "" >> $LOG
echo `date` >> $LOG
echo "##############################" >> $LOG
chown -R nobody:nobody /yin/
$RSYNC -vaztpH --timeout=90--exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG
fi
#--exclude-from 可不要根據需求不同步的排除
5、修改完上面腳本後授執行權限。
chmod +x post-commit
綜上所述:便可實現自動上傳代碼到線上服務器。
注:
注意幾個場景:
這裏的環境是SVN服務器與WEB服務器是開的
把SVN服務器定義爲源服務器 WEB服務器爲目的服務器
場景一、如果目的WEB服務器爲綜合的混雜的,像只有一個WEB靜態資源,用戶提交的,自動生成的都在WEB的一個目錄下,建議不要用–delete這個參數
上面這個程序就是這樣,實現的是源服務器到目的服務器的更新和添加,而沒有刪除操作,WEB服務器的內容會多於源SVN的服務器的
場景二、實現鏡像,即目的WEB服務器與源SVN服務器一樣的數據,SVN上任何變化WEB上一樣的變化,就需要–delete參數
場景三、不需要同步某些子目錄,可能有些目錄是緩存的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數
注意:這個參數的使用不用寫絕對路徑,只要目錄名稱就行 aa代表文件 aa/ 代表目錄 ,缺點就是如果有多個子目錄都是一樣的名稱那麼這些名稱就都不會被同步
建議用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和刪除
exclude.list
.svn/
.DS_Store
p_w_picpaths/
利用SVN的鉤子還可以寫出很多的程序來控制SVN 如代碼提交前查看是否有寫日誌,是否有tab,有將換成空格,是否有不允許上傳的文件,是否有超過限制大小的文件等等。
注:
export LANG=en_US.UTF-8 ------這是爲了解決svn post commit 中文亂碼,設置本地化編碼,也防止此腳本不能執行。