天天看點

SVN 鈎子

允許使用者修改Subversion日志的鈎子腳本 (windows)

我想用過Subversion的人一定有過這樣的問題:“為什麼不允許使用者修改日志?”,因為這種改變不可還原(目前這個操作還沒有受到版本控制的管理),是以這項功能預設是被禁止的。如果要開啟它,必須設定一個pre-revprop-change鈎子。

版本庫生成後,hooks目錄下就存在一些鈎子腳本的模闆,使用者可以作為參考。這裡我們可以把已經存在的pre-revprop-change.tmpl複制一份,将複制後的檔案名改為pre-revprop-change.bat,鈎子就設定好了。注意Windows下鈎子腳本必須以.bat或者.exe的擴充名形式存在。

預設的鈎子模闆使用的是linux下的腳本語言,不能在Windows下運作。是以我們必須重寫,這裡介紹用批處理檔案來寫鈎子腳本的方法。最簡單的允許修改日志的pre-revprop-change.bat連一行都不需要,直接把pre-revprop-change.bat的内容清空就行了,因為按照Subversion的約定,鈎子腳本傳回0就是允許修改任何屬性。(關于鈎子腳本的約定可參考這篇文章http://blog.donews.com/foxgem/archive/2005/11/03/613854.aspx)

但是假如我們希望作些判斷,比如隻允許修改日志,而不允許修改使用者名或者其他屬性,那麼下面是一個範例:

SET REPOS="%1"

SET REV="%2"

SET USER="%3"

SET PROPNAME="%4"

SET ACTION="%5"

IF %ACTION% == "M" (IF %PROPNAME% == "svn:log" (EXIT 0))

ECHO "Changing revision properties %PROPNAME% is prohibited" >&2

EXIT 1

利用Subversion的一個程式svnlook,腳本中可以通路的資訊就不僅僅隻有傳遞進來的5個參數了,進而可以實作更多的功能。比如判斷修改日志的使用者是不是以前進行送出的那個作者,如果不是就不允許修改。

隻允許使用者修改自己的svn日志的鈎子腳本:

for /f "usebackq" %%k in (`svnlook author %1 -r%2`) do @set var=%%k

if "%3" == "%var%" goto test

if "%3" == "li" goto test

exit 1

:test

if "%4" == "svn:log" exit 0

echo Property '%4' cannot be changed >&2

exit 1

實作每人可以修改自己的log日志,而管理者li可以任意修改。這個例子是從網上摘抄來的,因為手頭上缺少svnlook,是以沒有進行測試。

----------------------------------------------------------------------

Subversion送出強制寫日志(windows)

在每次送出的時候寫明送出的目的是一個很好的習慣,Subversion預設沒有提供,但是可以通過鈎子實作:

将下面的代碼存為pre-commit.bat放到版本庫的hooks目錄下即可,當你不寫日志送出的話就會報告錯誤。(如果你下載下傳使用,需要修改SVN_BINDIR為你的Subversion安裝的程式目錄)

@echo off

set SVN_BINDIR=d:\Subversion\bin

setlocal

set REPOS=%1

set TXN=%2

rem check that logmessage contains at least 10 characters

%SVN_BINDIR%\svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul

if %errorlevel% gtr 0 goto err

exit 0

:err

echo Empty log message not allowed. Commit aborted! 1>&2

exit 1

繼續閱讀