先說說鉤子是干什么的吧,,簡單的說,svn鉤子就是在提交svn時前后所要觸發的事件,于是我們可以用鉤子做一些提交時的限制,及提交后的操作。最常用的一般有兩個,pre-commit,post-commit。下面分別簡單說下概念。
一、鉤子概述
1)start-commit — 開始提交的通知
描述
start-commit 在開始事務之前執行。通常用來確定用戶是否有提交權限。
如果 start-commit 鉤子程序返回非零值,提交就會在創建事務之前停止,stderr 的任何輸出都會返回到客戶端。
輸入參數
傳遞給你鉤子程序的命令行參數,按照順序是:
1.版本庫路徑
2.認證過的嘗試提交的用戶名
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops
2)pre-commit — 在提交結束之前提醒。
描述
pre-commit 鉤子在事務創建新版本之前運行。通常這個鉤子是用來保護因為內容或位置(例如,你要求所有到一個特定分支的提交必須包括一個 bug 追蹤的 ticket 號,或者是要求日志信息不為空)而不允許的提交。
如果 pre-commit 鉤子返回非零值,提交會終止,提交事務被刪除,所有 stderr 的輸出會返回到客戶端。?
輸入參數
傳遞給你鉤子程序的命令行參數,按照順序是:
1.版本庫路徑
2.提交事務的名稱
?
3)post-commit — 成功提交的通知。
描述
post-commit 鉤子在事務完成,創建新版本后執行。大多數人用這個鉤子來發送關于提交的描述性電子郵件,或者用來提醒其它工具(例如問題跟蹤),發生了提交動作。一些配置也使用這個鉤子觸發版本庫的備份進程。
如果 post-commit 鉤子返回非零值,提交不會終止,因為它已經完成。然后,所有 stderr 的輸出都會返回到客戶端,讓診斷鉤子的失敗更容易。
輸入參數
傳遞給你鉤子程序的命令行參數,按照順序是:
1.版本庫路徑
2.提交創建的修訂版本號
?
二、pre-commit鉤子舉例說明
1、此腳本會在提交前對事件進行檢查
[root@CentOS_11 test]# cat /svndata/test/hooks/pre-commit
#!/bin/sh
REPOS="$1"
TXN="$2"
export LANG=en_US.UTF-8 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;?export LC_CTYPE=en_US.UTF-8 #設置本地字符集編碼
MAX_SIZE=5242880000
FILTER='\.()$'
SVNLOOK=/usr/bin/svnlook
AUTHORS='(tao|wang)'
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" |wc -c` ? ? ? ? ? ? ? ? ? ??; ?判斷輸入log的最小字符,小于10個不讓提交
if [ $LOGMSG -lt 10 ];then
echo -e "log message can't be empty or less 9 chars as commit!" >&2
exit 1
fi
SVNUSER=`$SVNLOOK author -t "$TXN" "$REPOS"` ? ? ? ? ? ? ? ? ? ? ? ?; ?限制提交用戶,不是腳本定義的用戶不讓提交,不過基本svn權限配置文件就夠了。
if echo $SVNUSER |/bin/grep -vEq $AUTHORS ;then
echo -e "Sorry you no be author" >&2
exit 1
fi
#定義過濾出當前提交的所以文件內容
File=$($SVNLOOK changed -t $TXN $REPOS|cut -d " " -f 4-) ? ? ? ? ? ?; ?限制提交文件的類型
?
#對當前提交的所有文件進行循環
echo "$File" |while read f;do
#如果文件被過濾出來就則匹配,輸出不允許提交。
if echo $f |tr A-Z a-z|grep -Eq $FILTER;then
echo "File $f is not allow $FILTER file" >&2
exit 1
fi
FilesSize=`$SVNLOOK cat -t "$TXN" "$REPOS" "$f" |wc -c` ? ? ? ? ? ? ?; 限制單個文件提交的大小
if [ "$FilesSize" -gt "$MAX_SIZE" ];then
echo "File $f is too large(must <=$MAX_SIZE)B" >&2
exit 1
fi
done
======================
提示:將以上腳本放到版本庫的hooks下,并給執行權限,將提交時如果有符合以上限制,將限制提交。這里就不作測試,可自行測試,很簡單。
======================
?
二、post-commit鉤子舉例說明
post-commit是在提交后進行的操作事件,用這個我們可以實現兩個SVN服務器的時時同步,保持版本庫的最新,或一些其他的方案,這里我只提供時時同步腳本。
環境:兩臺SVN服務器,版本庫全部相同。并且兩臺配置SSH無密鑰登陸。
說明:這里只在一臺SVN上操作,另一臺操作完全一樣。
腳本原理:
1)先通過ssh遠程執行無端SVN服務器中svn版本庫的版本號和當前SVN服務器SVN版本庫的版本號做對比。
2)對比完后,當前的SVN版本庫最新大于遠端SVN版本號,并通過svnadmin做增量備份。
3)備份完再通過ssh傳到遠端SVN服務器上,將增量備份進行還原操作
下面的腳本只是簡單的實現,并未做完善,大家可以自己寫更好的腳本實現,這里只是說明一個思路而已。
[root@CentOS_11 test]# cat /svndata/test/hooks/post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
SVNLOOK=/usr/bin/svnlook
R_ID=`/usr/bin/ssh root@192.168.1.12 "$SVNLOOK youngest /svndata/test/"`
L_ID=`$SVNLOOK youngest $REPOS`
[ "$R_ID" -eq "$L_ID" ] && {
echo "The ID is neweast!!" >>/root/a.log
}
[ "$R_ID" -gt "$L_ID" ] && {
echo "Warning The R_ID is Biger than L_ID" >>/root/a.log
}
[ "$R_ID" -lt "$L_ID" ] && {
R_ID_1=$((${R_ID}+1))
sleep 1
/usr/bin/svnadmin dump --incremental -r ${R_ID_1}:${L_ID} /svndata/test >/root/svn_inter_bak/test_${R_ID_1}:${L_ID}
[ $? -ne 0 ] && {
echo "bakcup test dump failed" >>/root/a.log
}||{
echo "test dump is OK" >>$LOGS/a.log
sleep 1
}
/usr/bin/scp /root/svn_inter_bak/test_${R_ID_1}:${L_ID} root@192.168.1.12:/root/svn_inter_dir/
[ $? -eq 0 ] && {
# /usr/bin/ssh root@192.168.1.12 "/bin/sh /root/svn_inter_restore.sh"
ssh root@192.168.1.12 "/usr/bin/svnadmin load /svndata/test < /root/svn_inter_dir/*"
ssh root@192.168.1.12 "/bin/rm -f /root/svn_inter_dir/*"
}||{
echo "warning..scp remote is failed" >>/root/a.log
}
}
====================完=============================?
?