前言
本文主要讲怎么开启SVN服务端如何配置允许用户修改已提交记录的备注信息,以及相关的脚本说明。纯干货分享,希望对各位读者有所帮助
默认情况下,SVN是不允许修改已提交记录的备注信息的,如果尝试修改svn服务端会返回以下信息:
Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
如需启用,可以按照以下步骤进行操作
步骤一:切换到svn仓库的目录中,进入hook目录

步骤二:新建pre-revprop-change.bat
文件
进入hook
目录中后,我们可以看见里面有很多*.tmpl
文件,这些是各种钩子脚本的模板,主要是给管理员配置参考的。钩子模板里面的脚本似乎还是shell脚本,也不适合window直接使用,但是里面有着钩子函数的详细入参,如果要进行个性化的配置的话,是需要认真看模板中的参数内容的。
然后我们在hook
目录中新建pre-revprop-change.bat
文件即可

步骤三:脚本中写入校验内容
这里的内容仅作为参考,个人觉得已经可以满足大部分场景的需要了
脚本首先是接收了钩子函数传递过来的五个参数,分别是仓库名repository
、版本号repository
、用户名userName
、修改内容propertyName
、操作动作action
- 校验1:判断修改的内容是否是备注内容,是的话进入下一个校验,否的话直接退出
- 校验2:判断动作是否属于修改操作,是的话进入下一个校验,否的话直接退出
- 校验3:判断修改人是否是原记录提交者,是的话进入下一个校验,否的话直接退出
- 校验4:判断修改的新备注内容是否不为空,是的话则通过,否的话直接退出
所有因校验失败而退出的操作都会把相关的提示语返回给客户端~
@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition 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" goto ERROR_PROPNAME
:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION
:: Only allow editing of the same user.
for /f "tokens=*" %%a in (
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do (
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER
:: 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_SAME_USER
echo Only the same user can change his code. >&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
这里需要特别注意,pre-revprop-change
是 SVN
版本控制系统中的一个钩子(hook),用于在尝试修改版本属性(revision property)之前执行自定义的操作和验证。常见的版本属性包括版本提交者、提交时间、修改日志等,不仅仅局限在修改提交备注信息上面,所以如果启用这个钩子,一定要记得做好相关的防护校验,避免版本信息被恶意修改!!!
2023-12-18补充
这里针对不允许修改超过3个月前的记录,来单独给一下脚本吧,bat
脚本来实现会稍微复杂一点。因为原生的bat脚本语法有点弱鸡,如果加上具体日期判断的话就太复杂了,所以下面的脚本只是精确到月份而已,如果有更好的方式也欢迎交流。
若脚本对你有帮助也欢迎点赞支持~
:: Only allow editing the records within the last three months.
for /f "tokens=*" %%a in (
'"%VISUALSVN_SERVER%\bin\svnlook.exe" date -r %revision% %repository%') do (
set orgDate=%%a
)
set "orgFormatDate=%orgDate:~0,10%"
:: Get date of origin record
for /F "tokens=1-3 delims=-" %%A in ("%orgFormatDate%") do (
set /a "ORG_FORMAT_YEAR=%%A"
set "ORG_FORMAT_MONTH=%%B"
)
:: Transfer string to number
set /a ORG_FORMAT_MONTH=1%ORG_FORMAT_MONTH% - 100
:: Get date before 3 months
set CURRENT_DATE=%DATE:~0,10%
for /F "tokens=1-3 delims=/" %%A in ("%CURRENT_DATE%") do (
set "CURRENT_YEAR=%%A"
set "CURRENT_MONTH=%%B"
)
set /a THREE_MONTHS_AGO_MONTH=1%CURRENT_MONTH%-103
if %THREE_MONTHS_AGO_MONTH% LEQ 0 (
set /a THREE_MONTHS_AGO_MONTH+=12
set /a THREE_MONTHS_AGO_YEAR=%CURRENT_YEAR%-1
) else (
set /a THREE_MONTHS_AGO_YEAR=%CURRENT_YEAR%
)
if %ORG_FORMAT_YEAR% LSS %THREE_MONTHS_AGO_YEAR% (
goto ERROR_EXCEED_TIME_LIMIT
) else if %ORG_FORMAT_YEAR% EQU %THREE_MONTHS_AGO_YEAR% (
if %THREE_MONTHS_AGO_MONTH% GTR %ORG_FORMAT_MONTH% (
goto ERROR_EXCEED_TIME_LIMIT
)
)
:ERROR_EXCEED_TIME_LIMIT
echo Only could update the comment within three months. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
网友评论