所谓hooks,可以类似理解Linux内核Netfilter框架的hook点和hook函数的概念。当用户在维护代码的过程中,其执行的相关动作正好触发了相关hook点,就会去执行对应hook点的脚本。
SVN 版本库目录下有hooks目录,里面有很多.tmpl的文件。这些文件用以定义某些动作触发的hook脚本。默认状态下,这些脚本的后缀都是.tmpl, 是不起作用的。相当于Netfilter的各个hook点没有注册hook函数。所以,当用户执行相关维护代码动作的时候,也不会触发hook脚本。因 此在默认状态下,用户提交代码的时候,不用添加注释信息也会被版本看所接受。而且,用户想修改自己的注释时,会得到服务器拒绝的相关提示信息。
在开发项目过程中,团队中总是有人忘记添加注释。团队其他成员不知道你提交是什么代码, 给回滚操作带来很多不必要的麻烦。SVN支持设置来提醒添加必要注释并规范日志的大小,比如日志最少字数为五个。这一功能增强了团队合作能力。以下将就Windows下SVN设置详细介绍。本文介绍方法适用于Windows系统,默认SVN客户端TortoiseSvn已经安装,TortoiseSvn下载、安装方法,这里不再赘述。
假定Repository为用户在SVN服务器端或客户端所创建的版本库,则该文件夹下文件分布如下:
强制添加注释并设置最少字数
方法一:用户提交代码的动作,对应的是pre-commit。因此,可以修改hooks\pre-commit.tmpl文件。文件名修改为pre-commit,Windows下可以修改为pre-commit.bat。其内容如下:
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
rem .....代表5个字符
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
方法二:
通过TortoiseSvn,在本地副本中,选择项目,右键选择TortoiseSvn,选择属性,添加tsvn:logminsize,将值限定为 10,添加了logminsize属性后,要将本地工作副本commit一下,才能生效。如下图:
提交注释长度少于5个,失败提示如下:
允许修改日志内容/添加遗漏日志
用户修改注释信息的动作,对应的是pre-revpos-change. 将hooks/下pre-revpos-change.tmpl更名为pre-revpos-change.bat。通常该文件包含的功能就是允许用户修改注释信息。其内容如下:
@ECHO OFF
:: Set all parameters. Even though most are not used, in case youwant to add
:: changes that allow, for example, editing of the author oraddition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5
:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" gotoERROR_PROPNAME
:: Only allow modification of a log message, not addition ordeletion.
if /I not "%action%" == "M" goto ERROR_ACTION
:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed.>&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1