我们在Windows上将VisualSVN Server设置为我们的Subversion服务器,我们在工作站上使用Ankhsvn + TortoiseSVN作为客户端.
如何配置服务器以要求提交消息为非空?
我很高兴你问这个问题.这是我们在常见Windows Batch中编写的预提交钩子脚本.如果日志消息少于6个字符,则拒绝提交.只需将pre-commit.bat放入hooks目录即可.
预commit.bat
setlocal enabledelayedexpansion set REPOS=%1 set TXN=%2 set SVNLOOK="%VISUALSVN_SERVER%\bin\svnlook.exe" SET M= REM Concatenate all the lines in the commit message FOR /F "usebackq delims==" %%g IN (`%SVNLOOK% log -t %TXN% %REPOS%`) DO SET M=!M!%%g REM Make sure M is defined SET M=0%M% REM Here the 6 is the length we require IF NOT "%M:~6,1%"=="" goto NORMAL_EXIT :ERROR_TOO_SHORT echo "Commit note must be at least 6 letters" >&2 goto ERROR_EXIT :ERROR_EXIT exit /b 1 REM All checks passed, so allow the commit. :NORMAL_EXIT exit 0
VisualSVN Server 3.9提供VisualSVNServerHooks.exe check-logmessage
预提交挂钩,可帮助您拒绝提交空或短日志消息的提交.有关说明,请参阅文章KB140:验证VisualSVN Server中的提交日志消息.
除了内置的VisualSVNServerHooks.exe
,VisualSVN Server和SVN通常使用许多钩子来完成这样的任务.
start-commit
- 在提交事务开始之前运行,可用于执行特殊权限检查
pre-commit
- 在事务结束时运行,但在提交之前运行.通常用于验证诸如非零长度日志消息之类的内容.
post-commit
- 在提交事务后运行.可用于发送电子邮件或备份存储库.
pre-revprop-change
- 在修订属性更改之前运行.可用于检查权限.
post-revprop-change
- 在修订版属性更改后运行.可用于通过电子邮件发送或备份这些更改.
你需要使用pre-commit
钩子.您可以使用您的平台支持的任何语言自己编写,但Web上有许多脚本.谷歌搜索"svn precommit挂钩要求评论"我发现一对看起来像他们适合该法案:
Perl脚本
Python脚本
已经给出了您的问题的技术答案.我想添加社交答案,即:"通过与您的团队建立提交消息标准并让他们同意(或接受)为什么需要表达性提交消息的原因"
我看过很多提交消息,上面写着"补丁","拼写错误","修复"或类似错误.
真的 - 让每个人都清楚你为什么需要它们.
原因的例子是:
生成的Changenotes(嗯 - 这实际上是一个很好的自动工具来强制执行好消息,如果我知道他们将(以我的名字)公开可见 - 如果只是为了团队)
许可证问题:您可能需要稍后知道代码的来源,例如,您是否希望将许可证更改为您的代码(有些组织甚至有提交邮件格式的标准 - 好吧,您可以自动检查这个,但是你会不一定得到好的提交消息与此)
与其他工具的互操作性,例如与您的版本控制接口并从提交消息中提取信息的bugtrackers /问题管理系统.
希望有帮助,除了关于precommit钩子的技术答案.
这是一个两部分示例Batch + PowerShell预提交挂钩,它拒绝提交少于25个字符的日志消息.
把两者pre-commit.bat
并pre-commit.ps1
为您的存储库hooks
文件夹,如C:\Repositories\repository\hooks\
预commit.ps1
# Store hook arguments into variables with mnemonic names
$repos = $args[0]
$txn = $args[1]
# Build path to svnlook.exe
$svnlook = "$env:VISUALSVN_SERVER\bin\svnlook.exe"
# Get the commit log message
$log = (&"$svnlook" log -t $txn $repos)
# Check the log message contains non-empty string
$datalines = ($log | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
# Log message is empty. Show the error.
[Console]::Error.WriteLine("Commit with empty log message is prohibited.")
exit 3
}
exit 0
预commit.bat
@echo off
set PWSH=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
%PWSH% -command $input ^| %1\hooks\pre-commit.ps1 %1 %2
if errorlevel 1 exit %errorlevel%
注1:pre-commit.bat
是唯一可以被VisualSVN调用的,然后pre-commit.ps1
是被调用的那个pre-commit.bat
.
注2:pre-commit.bat
也可以命名pre-commit.cmd
.
注3:如果您尝试编码问题与一些重音符号的字符和[Console]::Error.WriteLine
输出,再加入例如chcp 1252
成pre-commit.bat
后,下一行@echo off
.