這篇主要介紹下 svn 鉤子的使用,svn 的安裝以及配置等能夠查看 svn 的使用(一)
這里面就存放這個各種svn操作同一時候會運行的腳本文件。
(你能夠自己查看每一個腳本文件,文件開始都有英文的介紹包含功能,參數以及返回值。
?? 我翻譯的不好所以就採用網上其他資料的解釋吧 - -! )
1.start-commit? 開始提交的通知
輸入參數:傳遞給你鉤子程序的命令行參數,順序例如以下:
??? 1. 版本號庫路徑
??? 2. 已經認證過的提交的username
它在提交事務產生前已執行,通經常使用來判定一個用戶是否有權提交。返回0表示認證通過。
2.pre-commit 在提交結束之前提醒
輸入參數:傳遞給你鉤子程序的命令行參數。順序是:
???? 1. 版本號庫路徑
???? 2. 提交事務的名稱
在事務完畢提交之前執行,通常這個鉤子是用來保護由于內容或位置(比如。你要求全部到一個特定分支的提交必須包含一個bug追蹤的ticket號,或者是 要求日志信息不為空)而不同意的提交。
無錯誤返回0。
?
3.post-commit? 成功提交的通知
傳遞給你鉤子程序的命令行參數。順序為:
???? 1. 版本號庫路徑
???? 2. 提交創建的修訂版本
它在事務完畢后執行,創建一個新的修訂版本號。無錯誤程序正常退出。
?
4.pre-revprop-change 版本號屬性改動
由于Subversion的修訂版本號屬性不是版本號化的,對這類屬性的改動(比如提交日志屬性svn:log)將會永久覆蓋曾經的屬性值。由于數據在此可能 丟失。所以Subversion提供了這樣的鉤子(及與之相應的post-revprop-change),因此版本號庫管理員可用一些外部方法記錄變化。
作 為對丟失未版本號化屬性數據的防范。Subversionclient不能遠程改動修訂版本號屬性,除非為你的版本號庫實現這個鉤子。
5.post-revprop-change 版本號屬性改動
這個鉤子與pre-revprop-change相應。
其實,由于多疑的原因,僅僅有存在pre-revprop-change時這個腳本才會執行。當這 兩個鉤子都存在時。post-revprop-change在修訂版本號屬性被改變之后執行,通經常使用來發送包括新屬性的email。版本號庫傳遞四個參數給該 鉤子:到版本號庫的路徑,屬性存在的修訂版本號。經過校驗的產生變化的username,和屬性自身的名字。
使用這些鉤子最簡單的方法就是
拷貝某個腳本,去掉.tmpl擴展名,然后自己定義鉤子的內容,確定腳本是可執行的。
PS:一定要確保鉤子腳本是可運行的。
并且名稱就是去掉.tmpl后的名字。
另外要注意要使用SVN的鉤子一定要開設權限,并且是要用執行SVN的賬號進行執行這些鉤子
(假設不是能夠執行的會提示錯誤,錯誤代碼為255。其它錯誤能夠自行嘗試。。)
我想要做的就是 用戶commit 后server(測試環境的)自己主動同步 即做update操作
這里我的webserver和svnserver 在一臺。(假設是遠程的webserver能夠在
先使用ssh命令登入
)
那么我們須要使用的鉤子是post-commit
我們能夠使用命令
cp post-commit.tmpl post-commit.tmpl.bak
mv post-commit.tmpl post-commit
(別忘了 chmod 設置為可運行的)
chmod 755 post-commit
vi post-commit
這里我們能夠先做一個測試
即在文件最后加上一行
/bin/echo "commit" >> /tmp/commit.out
然后運行commit 操作 看一下 commit.out 是不是多了 commit這個單詞
那么編寫我們的腳本在post-commit 文件最后加入命令
/usr/bin/svn update /www/project --username m0sh1 --password m0sh1
PS:這里要 加上絕對路徑 , update 后面的是checkout 下來的項目路徑
假設提示錯誤 svn: Can't convert string from native encoding to 'UTF-8'
則須要加入一行命令
export lang = en_US.UTF-8
此時去工作文件夾看下是不是更新了。。
再舉個樣例,有非常多開發者為了快,往往忽略掉提交日志信息(也可能無意為之)。那么我們能夠在pre-commit腳本
中做出必須提交日志信息的限制:
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
?? grep "[a-zA-Z0-9]" > /dev/null || exit 1
# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
# All checks passed, so allow the commit.
exit 0
(上面內容直接就是pre-commit腳本中的內容,那么僅僅須要給pre-commit可運行的權限就能夠了。)
之后我們就能夠以此,類推出其他想要實現的功能了。