鉤子腳本的具體寫法就是操作系統(tǒng)中shell腳本程序的寫法,請根據(jù)自己SVN所在的操作系統(tǒng)和shell程序進(jìn)行相應(yīng)的寫作
所謂鉤子就是與一些版本庫事件觸發(fā)的程序,例如新修訂版本的創(chuàng)建,或是未版本化屬性的修改。每個(gè)鉤子都會(huì)被告知足夠多的信息,包括那是什么事件,所操作的對象,和觸發(fā)事件的用戶名。通過鉤子的輸出或返回狀態(tài),鉤子程序能讓工作繼續(xù)、停止或是以某種方式掛起。
默認(rèn)情況下,鉤子的子目錄中包含各種版本庫鉤子模板。
$ ls repos/hooks/
post-commit.tmpl pre-revprop-change.tmpl
post-revprop-change.tmpl start-commit.tmpl
pre-commit.tmpl
對每種Subversion版本庫支持的鉤子的都有一個(gè)模板,通過查看這些腳本的內(nèi)容,你能看到是什么事件觸發(fā)了腳本及如何給傳腳本傳遞數(shù)據(jù)。同時(shí),這些模版也是如何使用這些腳本,結(jié)合Subversion支持的工具來完成有用任務(wù)的例子。要實(shí)際安裝一個(gè)可用的鉤子,你需要在 repos/hooks目錄下安裝一些與鉤子同名(如 start-commit或者post-commit)的可執(zhí)行程序或腳本。
提示
由于安全原因,Subversion版本庫在一個(gè)空環(huán)境中執(zhí)行鉤子腳本—就是沒有任何環(huán)境變量,甚至沒有$PATH或%PATH%。由于這個(gè)原因,許多管理員會(huì)感到很困惑,它們的鉤子腳本手工運(yùn)行時(shí)正常,可在Subversion中卻不能運(yùn)行。要注意,必須在你的鉤子中設(shè)置好環(huán)境變量或?yàn)槟愕某绦蛑付ê媒^對路徑。
目前Subversion有已實(shí)現(xiàn)了五種鉤子:
start-commit.bat
它在提交事務(wù)產(chǎn)生前已運(yùn)行,通常用來判定一個(gè)用戶是否有權(quán)提交。版本庫傳給該程序兩個(gè)參數(shù):到版本庫的路徑,和要進(jìn)行提交的用戶名。如果程序返回一個(gè)非零值,會(huì)在事務(wù)產(chǎn)生前停止該提交操作。如果鉤子程序要在stderr中寫入數(shù)據(jù),它將排隊(duì)送至客戶端。
pre-commit.bat
在事務(wù)完成提交之前運(yùn)行,通常這個(gè)鉤子是用來保護(hù)因?yàn)閮?nèi)容或位置(例如,你要求所有到一個(gè)特定分支的提交必須包括一個(gè)bug追蹤的ticket號,或者是要求日志信息不為空)而不允許的提交。版本庫傳遞兩個(gè)參數(shù)到程序:版本庫的路徑和正在提交的事務(wù)名稱,如果程序返回非零值,提交會(huì)失敗,事務(wù)也會(huì)刪除。如果鉤子程序在stderr中寫入了數(shù)據(jù),也會(huì)傳遞到客戶端。
Subversion的分發(fā)版本包括了一些訪問控制腳本(在Subversion源文件目錄樹的tools/hook-scripts目錄),可以用來被pre-commit調(diào)用來實(shí)現(xiàn)精密的寫訪問控制。另一個(gè)選擇是使用Apache的httpd模塊mod_authz_svn,可以對單個(gè)目錄進(jìn)行讀寫訪問控制(見“每目錄訪問控制”一節(jié))。在未來的Subversion版本中,我們計(jì)劃直接在文件系統(tǒng)中實(shí)現(xiàn)訪問控制列表(ACL)。
post-commit.bat
它在事務(wù)完成后運(yùn)行,創(chuàng)建一個(gè)新的修訂版本。大多數(shù)人用這個(gè)鉤子來發(fā)送關(guān)于提交的描述性電子郵件,或者作為版本庫的備份。版本庫傳給程序兩個(gè)參數(shù):到版本庫的路徑和被創(chuàng)建的新的修訂版本號。退出程序會(huì)被忽略。
Subversion分發(fā)版本中包括mailer.py和commit-email.pl腳本(存于Subversion源代碼樹中的 tools/hook-scripts/目錄中)可以用來發(fā)送描述給定提交的email(并且或只是追加到一個(gè)日志文件),這個(gè)mail包含變化的路徑清單,提交的日志信息、日期和作者以及修改文件的GNU區(qū)別樣式輸出。
Subversion提供的另一個(gè)有用的工具是hot-backup.py腳本(在Subversion源代碼樹中的tools/backup/目錄中)。這個(gè)腳本可以為Subversion版本庫進(jìn)行熱備份(Berkeley DB數(shù)據(jù)庫后端支持的一種特性),可以制作版本庫每次提交的快照作為歸檔和緊急情況的備份。
pre-revprop-change.bat
因?yàn)镾ubversion的修訂版本屬性不是版本化的,對這類屬性的修改(例如提交日志屬性 svn:log)將會(huì)永久覆蓋以前的屬性值。因?yàn)閿?shù)據(jù)在此可能丟失,所以Subversion提供了這種鉤子(及與之對應(yīng)的post-revprop- change),因此版本庫管理員可用一些外部方法記錄變化。作為對丟失未版本化屬性數(shù)據(jù)的防范,Subversion客戶端不能遠(yuǎn)程修改修訂版本屬性,除非為你的版本庫實(shí)現(xiàn)這個(gè)鉤子。
這個(gè)鉤子在對版本庫進(jìn)行這種修改時(shí)才會(huì)運(yùn)行,版本庫給鉤子傳遞四個(gè)參數(shù):到版本庫的路徑,要修改屬性的修訂版本,經(jīng)過認(rèn)證的用戶名和屬性自身的名字。
post-revprop-change.bat
我們在前面提到過,這個(gè)鉤子與pre-revprop-change對應(yīng)。事實(shí)上,因?yàn)槎嘁傻脑颍挥写嬖趐re-revprop-change時(shí)這個(gè)腳本才會(huì)執(zhí)行。當(dāng)這兩個(gè)鉤子都存在時(shí),post-revprop-change在修訂版本屬性被改變之后運(yùn)行,通常用來發(fā)送包含新屬性的email。版本庫傳遞四個(gè)參數(shù)給該鉤子:到版本庫的路徑,屬性存在的修訂版本,經(jīng)過校驗(yàn)的產(chǎn)生變化的用戶名,和屬性自身的名字。
Subversion分發(fā)版本中包含propchange-email.pl腳本(在Subversion源代碼樹中的tools/hook- scripts/目錄中),可以用來發(fā)送修訂版本屬性修改細(xì)節(jié)的email(并且或只是追加到一個(gè)日志文件)。這個(gè)email包含修訂版本和發(fā)生變化的屬性名,作出修改的用戶和新屬性值。
警告
不要嘗試用鉤子腳本修改事務(wù)。一個(gè)常見的例子就是在提交時(shí)自動(dòng)設(shè)置svn:eol-style或svn:mime-type這類屬性。這看起來是個(gè)好主意,但它會(huì)引起問題。主要的問題是客戶并不知道由鉤子腳本進(jìn)行的修改,同時(shí)沒有辦法通告客戶它的數(shù)據(jù)是過時(shí)的,這種矛盾會(huì)導(dǎo)致出人意料和不能預(yù)測的行為。
作為嘗試修改事務(wù)的替代,我們通過檢查pre-commit鉤子的事務(wù),在不滿足要求時(shí)拒絕提交。
Subversion會(huì)試圖以當(dāng)前訪問版本庫的用戶身份執(zhí)行鉤子。通常,對版本庫的訪問總是通過Apache HTTP服務(wù)器和mod_dav_svn進(jìn)行,因此,執(zhí)行鉤子的用戶就是運(yùn)行Apache的用戶。鉤子本身需要具有操作系統(tǒng)級的訪問許可,用戶可以運(yùn)行它。另外,其它被鉤子直接或間接使用的文件或程序(包括Subversion版本庫本身)也要被同一個(gè)用戶訪問。換句話說,要注意潛在的訪問控制問題,它可能會(huì)讓你的鉤子無法按照你的目的順利執(zhí)行
原文:http://hi.baidu.com/gacmotor/blog/item/da499e2b4f65fa25d42af192.html
所謂鉤子就是與一些版本庫事件觸發(fā)的程序,例如新修訂版本的創(chuàng)建,或是未版本化屬性的修改。每個(gè)鉤子都會(huì)被告知足夠多的信息,包括那是什么事件,所操作的對象,和觸發(fā)事件的用戶名。通過鉤子的輸出或返回狀態(tài),鉤子程序能讓工作繼續(xù)、停止或是以某種方式掛起。
默認(rèn)情況下,鉤子的子目錄中包含各種版本庫鉤子模板。
$ ls repos/hooks/
post-commit.tmpl pre-revprop-change.tmpl
post-revprop-change.tmpl start-commit.tmpl
pre-commit.tmpl
對每種Subversion版本庫支持的鉤子的都有一個(gè)模板,通過查看這些腳本的內(nèi)容,你能看到是什么事件觸發(fā)了腳本及如何給傳腳本傳遞數(shù)據(jù)。同時(shí),這些模版也是如何使用這些腳本,結(jié)合Subversion支持的工具來完成有用任務(wù)的例子。要實(shí)際安裝一個(gè)可用的鉤子,你需要在 repos/hooks目錄下安裝一些與鉤子同名(如 start-commit或者post-commit)的可執(zhí)行程序或腳本。
提示
由于安全原因,Subversion版本庫在一個(gè)空環(huán)境中執(zhí)行鉤子腳本—就是沒有任何環(huán)境變量,甚至沒有$PATH或%PATH%。由于這個(gè)原因,許多管理員會(huì)感到很困惑,它們的鉤子腳本手工運(yùn)行時(shí)正常,可在Subversion中卻不能運(yùn)行。要注意,必須在你的鉤子中設(shè)置好環(huán)境變量或?yàn)槟愕某绦蛑付ê媒^對路徑。
目前Subversion有已實(shí)現(xiàn)了五種鉤子:
start-commit.bat
它在提交事務(wù)產(chǎn)生前已運(yùn)行,通常用來判定一個(gè)用戶是否有權(quán)提交。版本庫傳給該程序兩個(gè)參數(shù):到版本庫的路徑,和要進(jìn)行提交的用戶名。如果程序返回一個(gè)非零值,會(huì)在事務(wù)產(chǎn)生前停止該提交操作。如果鉤子程序要在stderr中寫入數(shù)據(jù),它將排隊(duì)送至客戶端。
pre-commit.bat
在事務(wù)完成提交之前運(yùn)行,通常這個(gè)鉤子是用來保護(hù)因?yàn)閮?nèi)容或位置(例如,你要求所有到一個(gè)特定分支的提交必須包括一個(gè)bug追蹤的ticket號,或者是要求日志信息不為空)而不允許的提交。版本庫傳遞兩個(gè)參數(shù)到程序:版本庫的路徑和正在提交的事務(wù)名稱,如果程序返回非零值,提交會(huì)失敗,事務(wù)也會(huì)刪除。如果鉤子程序在stderr中寫入了數(shù)據(jù),也會(huì)傳遞到客戶端。
Subversion的分發(fā)版本包括了一些訪問控制腳本(在Subversion源文件目錄樹的tools/hook-scripts目錄),可以用來被pre-commit調(diào)用來實(shí)現(xiàn)精密的寫訪問控制。另一個(gè)選擇是使用Apache的httpd模塊mod_authz_svn,可以對單個(gè)目錄進(jìn)行讀寫訪問控制(見“每目錄訪問控制”一節(jié))。在未來的Subversion版本中,我們計(jì)劃直接在文件系統(tǒng)中實(shí)現(xiàn)訪問控制列表(ACL)。
post-commit.bat
它在事務(wù)完成后運(yùn)行,創(chuàng)建一個(gè)新的修訂版本。大多數(shù)人用這個(gè)鉤子來發(fā)送關(guān)于提交的描述性電子郵件,或者作為版本庫的備份。版本庫傳給程序兩個(gè)參數(shù):到版本庫的路徑和被創(chuàng)建的新的修訂版本號。退出程序會(huì)被忽略。
Subversion分發(fā)版本中包括mailer.py和commit-email.pl腳本(存于Subversion源代碼樹中的 tools/hook-scripts/目錄中)可以用來發(fā)送描述給定提交的email(并且或只是追加到一個(gè)日志文件),這個(gè)mail包含變化的路徑清單,提交的日志信息、日期和作者以及修改文件的GNU區(qū)別樣式輸出。
Subversion提供的另一個(gè)有用的工具是hot-backup.py腳本(在Subversion源代碼樹中的tools/backup/目錄中)。這個(gè)腳本可以為Subversion版本庫進(jìn)行熱備份(Berkeley DB數(shù)據(jù)庫后端支持的一種特性),可以制作版本庫每次提交的快照作為歸檔和緊急情況的備份。
pre-revprop-change.bat
因?yàn)镾ubversion的修訂版本屬性不是版本化的,對這類屬性的修改(例如提交日志屬性 svn:log)將會(huì)永久覆蓋以前的屬性值。因?yàn)閿?shù)據(jù)在此可能丟失,所以Subversion提供了這種鉤子(及與之對應(yīng)的post-revprop- change),因此版本庫管理員可用一些外部方法記錄變化。作為對丟失未版本化屬性數(shù)據(jù)的防范,Subversion客戶端不能遠(yuǎn)程修改修訂版本屬性,除非為你的版本庫實(shí)現(xiàn)這個(gè)鉤子。
這個(gè)鉤子在對版本庫進(jìn)行這種修改時(shí)才會(huì)運(yùn)行,版本庫給鉤子傳遞四個(gè)參數(shù):到版本庫的路徑,要修改屬性的修訂版本,經(jīng)過認(rèn)證的用戶名和屬性自身的名字。
post-revprop-change.bat
我們在前面提到過,這個(gè)鉤子與pre-revprop-change對應(yīng)。事實(shí)上,因?yàn)槎嘁傻脑颍挥写嬖趐re-revprop-change時(shí)這個(gè)腳本才會(huì)執(zhí)行。當(dāng)這兩個(gè)鉤子都存在時(shí),post-revprop-change在修訂版本屬性被改變之后運(yùn)行,通常用來發(fā)送包含新屬性的email。版本庫傳遞四個(gè)參數(shù)給該鉤子:到版本庫的路徑,屬性存在的修訂版本,經(jīng)過校驗(yàn)的產(chǎn)生變化的用戶名,和屬性自身的名字。
Subversion分發(fā)版本中包含propchange-email.pl腳本(在Subversion源代碼樹中的tools/hook- scripts/目錄中),可以用來發(fā)送修訂版本屬性修改細(xì)節(jié)的email(并且或只是追加到一個(gè)日志文件)。這個(gè)email包含修訂版本和發(fā)生變化的屬性名,作出修改的用戶和新屬性值。
警告
不要嘗試用鉤子腳本修改事務(wù)。一個(gè)常見的例子就是在提交時(shí)自動(dòng)設(shè)置svn:eol-style或svn:mime-type這類屬性。這看起來是個(gè)好主意,但它會(huì)引起問題。主要的問題是客戶并不知道由鉤子腳本進(jìn)行的修改,同時(shí)沒有辦法通告客戶它的數(shù)據(jù)是過時(shí)的,這種矛盾會(huì)導(dǎo)致出人意料和不能預(yù)測的行為。
作為嘗試修改事務(wù)的替代,我們通過檢查pre-commit鉤子的事務(wù),在不滿足要求時(shí)拒絕提交。
Subversion會(huì)試圖以當(dāng)前訪問版本庫的用戶身份執(zhí)行鉤子。通常,對版本庫的訪問總是通過Apache HTTP服務(wù)器和mod_dav_svn進(jìn)行,因此,執(zhí)行鉤子的用戶就是運(yùn)行Apache的用戶。鉤子本身需要具有操作系統(tǒng)級的訪問許可,用戶可以運(yùn)行它。另外,其它被鉤子直接或間接使用的文件或程序(包括Subversion版本庫本身)也要被同一個(gè)用戶訪問。換句話說,要注意潛在的訪問控制問題,它可能會(huì)讓你的鉤子無法按照你的目的順利執(zhí)行
原文:http://hi.baidu.com/gacmotor/blog/item/da499e2b4f65fa25d42af192.html