一、什么是鈎子
所謂svn的hook機制,就是用戶在管理數據倉庫的時候,當特定的事件發生時,相應的hook會被調用,hook 其實就相當於特定事件的處理函數。
當前 Subversion 提供了5種可以安裝的 hook :
事件名 |
時機 |
與hook交互 |
一般用途 |
start-commit |
事務創建之前。 |
傳給 hook 的 參數: - 參 數 1 , 代碼庫路徑。 - 參 數 2 , 試圖提交的用戶名。 hook 的返回值:非 0 則 終止。 |
判斷用戶是否有權限進行提交 操作。 |
pre-commit |
事務完成,但未提交。 |
- 參 數 1 , 代碼庫路徑。 - 參 數 2 , 事務名。 hook 的返回值:非 0 則 終止提交,操作回滾。 |
對提交內容進行檢查。如要求 提交必須填寫提交信息。 |
post-commit |
事務提交完畢,新的修訂版被 創建。 |
傳給 hook 的 參數: - 參 數 1 , 代碼庫路徑。 - 參 數 2 , 剛創建的修訂版號。 hook 的返回值被忽 略。 |
發送郵件通知,或備份代碼 庫。 |
pre-revprop-change |
修改修訂版屬性(如提交時提 供的信息 message )之前。 由於修訂版屬性一旦修改就會 永久的丟失,除非安裝這個事件的 hook, subversion 的 客戶端不允許遠程修改修訂版屬性。 |
傳給 hook 的 參數: - 參 數 1 , 代碼庫路徑。 - 參 數 2 , 要修改的修訂版號。 - 參 數 3 , 操作用戶名。 - 要 修改的屬性。 hook 的返回值:非 0 則 終止。 |
保存修訂版屬性的改變記錄。 |
post-revprop-change |
修訂版屬性值被修改之后。 如果沒有安裝 pre-revprop-change的 hook , 這個事件的 hook 不會被執行。 |
傳給 hook 的 參數: - 參 數 1 , 代碼庫路徑。 - 參 數 2 , 要修改的修訂版號。 - 參 數 3 , 操作用戶名。 - 要 修改的屬性。 hook 的返回值被忽 略。 |
發送郵件通知。 |
通常來說在當前倉庫下面的hook目錄,都會存在相應hook文件的模板,要讓相應hook文件起作用,就必須復制當前模板並去掉后面的.tmpl,然后編寫相應的邏輯。
二、hook實踐
我們主要想實現兩個hook功能:
- 用戶提交代碼的時候必須要寫提交信息,而且長度必須大於10
- 用戶提交完之后更新服務器上面相應的目錄
1. 用戶提交代碼的時候必須要寫提交信息,而且長度必須大於10
這個功能需要實現pre-commit:
1 #!/bin/sh 2 REPOS="$1" 3 TXN="$2" 4 5 LOGMSG=`svnlook log -t "$TXN" "$REPOS"|wc -c` 6 if [ $LOGMSG -lt 10 ]; then 7 echo $LOGMSG 1>&2 8 echo -e "\nLog message is too short" 1>&2 9 exit 1 10 fi 11 # All checks passed, so allow the commit. 12 exit 0
2.用戶提交完之后更新服務器上面相應的目錄
在hooks目錄下新增post-commit,並增加可執行權限:
1 REPOS="$1" 2 REV="$2" 3 PROJECT="/root/projects/hello" 4 PASSWD="/root/projects/save/svn_admin" 5 6 svn update -q $PROJECT --non-interactive --username admin --password `cat $PASSWD`
注意:保存后一定要把文件權限增加可執行權限,不然用戶會出現錯誤。
另外,由於安全原因,Subversion版本庫在一個空環境中執行鈎子腳本—就是沒有任何環境變量,甚至沒有$PATH或%PATH%。由於這個原因,許多管理員會感到很困惑,它們的鈎子腳本手工運行時正常,可在Subversion中卻不能運行。要注意,必須在你的鈎子中設置好環境變量或為你的程序指定好絕對路徑。