一、Svn鈎子腳本簡介
鈎子腳本的具體寫法就是作業系統shell腳本程式寫法,請根據自己SVN所在的作業系統和shell程式進行相應的開發。
鈎子腳本就是被某些版本庫事件觸發的程式,例如建立新版本或修改未被版本控制的屬性。每個鈎子都能掌管足夠的資訊來了解發生了什麼事件,操作對象是什麼以及觸發事件使用者的賬号。根據鈎子的輸出或者傳回狀态,鈎子程式能夠以某種方式控制該動作繼續執行,停止或者挂起。
svn的hooks模版功能介紹
start-commit送出前觸發事務
pre-commit送出完成前觸發事務
post-commit送出完成時觸發事務
pre-revprop-change版本屬性修改前觸發事務
post-revprop-change版本屬性修改後觸發事務
post-commit
在送出完成,成功建立版本之後執行該鈎子,送出已經完成,不可更改,是以腳本傳回值被忽略
post-lock
對檔案進行加鎖操作之後執行該腳本
post-revprop-change
在修改revision屬性之後,執行該腳本。因為修改稿已經完成,不可更改,是以本腳本的傳回值被飯忽略
(不過實際上的實作似乎是該腳本的正确執行與否影響屬性修改)
post-unlock
對檔案進行解鎖操作之後執行該腳本
pre-commit
在Subversion transaction完畢之後,在送出之前,執行該腳本
pre-revprop-change
在修改revision屬性之前,執行該腳本
start-commit
對用戶端還沒有向伺服器送出資料之前,即還沒有建立Subversion transaction(縮寫txn)之前,執行該腳本
預設情況下,鈎子的子目錄中包含各種版本庫鈎子模闆
[root@svn ~]# ls -l /application/svndata/sadoc/hooks/
總用量 36
-rw-r--r-- 1 root root 1977 6月 15 16:42 post-commit.tmpl
-rw-r--r-- 1 root root 1638 6月 15 16:42 post-lock.tmpl
-rw-r--r-- 1 root root 2289 6月 15 16:42 post-revprop-change.tmpl
-rw-r--r-- 1 root root 1567 6月 15 16:42 post-unlock.tmpl
-rw-r--r-- 1 root root 3426 6月 15 16:42 pre-commit.tmpl
-rw-r--r-- 1 root root 2410 6月 15 16:42 pre-lock.tmpl
-rw-r--r-- 1 root root 2786 6月 15 16:42 pre-revprop-change.tmpl
-rw-r--r-- 1 root root 2100 6月 15 16:42 pre-unlock.tmpl
-rw-r--r-- 1 root root 2780 6月 15 16:42 start-commit.tmpl
[root@svn hooks]# cp post-commit.tmpl post-commit
[root@svn hooks]# vim post-commit
REPOS="$1"
REV="$2"
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
touch /tmp/$(date +%MS).log
[root@svn hooks]# chmod 755 post-commit
二、在用戶端下
在D:\oldboy\trunk\test\tom.txt
<a href="http://s3.51cto.com/wyfs02/M02/6E/8D/wKiom1V_lRygEWoKAAD5op7ripE781.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/6E/8D/wKiom1V_lWXiXW62AAKXuB9Wx8g677.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/6E/89/wKioL1V_lyfxnifSAAIAa8d6RT4194.jpg" target="_blank"></a>
四、在傳回svn伺服器
送出完成,觸發程式,在/tmp下多了日志檔案
[root@svn hooks]# ll -lrt /tmp
總用量 16
drwx------. 2 root root 16384 4月 24 17:56 lost+found
-rw-r--r-- 1 root root 0 6月 16 11:04 04S.log
-rw-r--r-- 1 root root 0 6月 16 11:04 0452.log
-rw-r--r-- 1 root root 0 6月 16 11:06 0644.log
-rw-r--r-- 1 root root 0 6月 16 11:12 1224.log
-rw-r--r-- 1 root root 0 6月 16 11:15 1548.log
五、鈎子腳本post-commit
TXN="$2"
#此處更改大小限制,這裡是5M
MAX_SIZE=5242880
#此處增加限制檔案後比綴名
FILTER='\.(zip|rar|o|obj|tar|gz)$'
#Make sure that the log message contains some test
SVNLOOK=/usr/bin/svnlook
#LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c`
if [ "$LOGMSG" -lt 9 ];
then
echo -e "nLog message cann't be empty! you must input more than 8 chars as comment!." 1>&2
exit 1
fi
files=$($SVNLOOK changed -t $TXN $REPOS |cut -d "" -f 4-)
#echo "$files">&2
#echo "$r">&2
#exit 1
rc=0
echo "$files" | while read f;
do
#check file type
filesize=`$SVNLOOK cat -t "$TXN" "$REPOS" "$f" | wc -c `
if [ "filezie" -gt "$MAX_SIZE" ];
echo "File $f is too large(must <+$MAX_SIZE)B" >&2
exit 1
done
#All checks passed,so allow the commit.
if [ $? -eq 1 ];
else
exit 0
本文轉自 zouqingyun 51CTO部落格,原文連結:http://blog.51cto.com/zouqingyun/1662285,如需轉載請自行聯系原作者