Subversion自己有很好的擴展性,用戶能夠經過鉤子實現一些自定義的功能。所謂鉤子其實是一種事件機制,當系統執行到某個特殊事件時,會觸發咱們預約義的動做,這樣的特殊事件在Subversion裏有不少。那麼SVN的鉤子有哪些呢?下面簡單介紹下:服務器
服務器鉤子:svn
鎖定的2種post
pre-lock測試
鉤子在每次有人嘗試鎖定文件時執行。能夠防止徹底鎖定,或者用來建立控制哪些用戶能夠鎖定哪些路徑的複雜策略。若是鉤子發現已存在鎖,也能夠決定是否容許用戶「竊取」這個鎖。.net
post-lock日誌
在路徑鎖定後執行。一般用來發送鎖定事件郵件通知。code
解鎖的2種blog
pre-unlock事件
鉤子在某人企圖刪除一個文件上的鉤子時發生。能夠用來建立哪些用戶能夠解鎖哪些文件的策略。制定解鎖策略很是重要。若是用戶 A 鎖定了一個文件,容許用戶B 打開這個鎖?若是這個鎖已經一週了呢?這種事情能夠經過鉤子決定並強制執行。事務
post-unlock
在一個或多個路徑已經被解鎖後執行。一般用來發送解鎖事件通知郵件。
提交的3種
start-commit
它在提交事務產生前已運行,一般用來斷定一個用戶是否有權提交。版本庫傳給該程序兩個參數:到版本庫的路徑,和要進行提交的用戶名。若是程序返回一個非零值,會在事務產生前中止該提交操做。若是鉤子程序要在stderr中寫入數據,它將排隊送至客戶端。
pre-commit
在事務完成提交以前運行,一般這個鉤子是用來保護由於內容或位置(例如,你要求全部到一個特定分支的提交必須包括一個bug追蹤的ticket號,或者是要求日誌信息不爲空)而不容許的提交。版本庫傳遞兩個參數到程序:版本庫的路徑和正在提交的事務名稱,若是程序返回非零值,提交會失敗,事務也會刪除。如 果鉤子程序在stderr中寫入了數據,也會傳遞到客戶端。
post-commit
它在事務完成後運行,建立一個新的修訂版本。大多數人用這個鉤子來發送關於提交的描述性電子郵件,或者做爲版本庫的備份。版本庫傳給程序兩個參數:到版本庫的路徑和被建立的新的修訂版本號。退出程序會被忽略。
屬性的2種
pre-revprop-change
由於Subversion的修訂版本屬性不是版本化的,對這類屬性的修改(例如提交日誌屬性svn:log)將會永久覆蓋之前的屬性值。由於數據在此可能 丟失,因此Subversion提供了這種鉤子(及與之對應的post-revprop-change),所以版本庫管理員可用一些外部方法記錄變化。做 爲對丟失未版本化屬性數據的防範,Subversion客戶端不能遠程修改修訂版本屬性,除非爲你的版本庫實現這個鉤子。
post-revprop-change
這個鉤子與pre-revprop-change對應。事實上,由於多疑的緣由,只有存在pre-revprop-change時這個腳本纔會執行。當這 兩個鉤子都存在時,post-revprop-change在修訂版本屬性被改變以後運行,一般用來發送包含新屬性的email。版本庫傳遞四個參數給該 鉤子:到版本庫的路徑,屬性存在的修訂版本,通過校驗的產生變化的用戶名,和屬性自身的名字。
客戶端鉤子:
提交的
start commit hook
pre-commit hook
post-commit hook
更新的
start update hook
pre-update hook
post-update hook
今天研究了一下如何使用SVN鉤子強制提交日誌和限制提交文件類型。此次咱們用到的是服務端鉤子pre-commit。網上有篇文章使用jscript來實現這個功能:Windows下WSH/JS實現SVN服務器鉤子腳本阻止提交空日誌信息和垃圾文件。我測試過該文章,發現提交限制文件時確實有效,可是提交正常的源碼文件時卻陷入一種相似死循環的等待中。個人測試環境是:客戶端 Win XP + sp3,服務器端:WinServer2008 Enterprise。
爲此只好本身參考網上的代碼本身寫了一下,代碼以下:
@echo rem SVN強制寫註釋的hooks腳本(Windows) rem 文件名是: pre-commit.bat,放到repository/hooks目錄下 setlocal set SVN_BINDIR="C:\Program Files (x86)\SlikSvn\bin" set REPOS=%1 set TXN=%2 rem 檢查是否提交日誌 %SVN_BINDIR%\svnlook log -t "%TXN%" "%REPOS%" | findstr "......" > nul if %errorlevel% gtr 0 goto nolog rem 過濾文件類型 %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "obj$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "pdb$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "idb$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "manifest$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "pch$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "res$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "exp$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "ilk$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "dep$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "user$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "suo$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "ncb$" if %errorlevel% EQU 0 (goto SuffixError) %SVN_BINDIR%\svnlook changed -t "%TXN%" "%REPOS%" | findstr "aps$" if %errorlevel% EQU 0 (goto SuffixError) exit 0 :SuffixError echo 請不要提交受限制的文件類型,如:obj、pdb、exp、ilk等等,謝謝! 1>&2 exit 1 :nolog echo 日誌(Message)是跟蹤文檔的重要信息,必須輸入,不得輸入無心義字符,長度不得小於6個字符。 1>&2 exit 1
簡單說明下:SVN_BINDIR路徑爲你的SVN服務端程序所在的目錄,svnlookchanged -t "%TXN%" "%REPOS%" | findstr "obj$"爲比較你提交的文件是否爲obj文件(即後綴是否爲obj)。
部署方式是將上面的批處理代碼保存在pre-commit.bat(必須是這個名字),而後把它放到服務端的版本庫的hooks文件夾下。該腳本經測試有效,測試環境爲客戶端 Win XP + sp3,服務器端:Win Server2008 Enterprise。