Windows下用于检查Subversion提交注释长度的Pre-commit hook

34

我似乎在这方面一无所获。要么搜索网上的脚本等等。有人有一个脚本可以在Windows环境中编辑out-of-box pre-commit.tmpl,要求在Tortoise Subversion全局提交时输入x个字符的注释,以便所有团队成员都需要,而此要求从SVN服务器向客户端推送?

我不知道脚本语言,这应该是非常简单的事情,而不需要我花3个小时去学习脚本。

5个回答

57
这是一个批处理文件,要求必须有注释。它会检查注释中是否至少存在一个字符。
 @echo off  
 :: Stops commits that have empty log messages.        
 @echo off  

 setlocal  

 rem Subversion sends through the path to the repository and transaction id  
 set REPOS=%1  
 set TXN=%2           

 svnlook log %REPOS% -t %TXN% | findstr . > nul  
 if %errorlevel% gtr 0 (goto err) else exit 0  

 :err  
 echo. 1>&2  
 echo Your commit has been blocked because you didn't enter a comment. 1>&2  
 echo Write a log message describing the changes made and try again. 1>&2
 echo Thanks 1>&2
 exit 1

这个文件位于仓库的/hooks文件夹中,名为pre-commit.bat。如果你需要最少数量的字符,要修改的行是

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

因此,如果您想要至少10个字符,您需要有10个 "." 而不仅仅是一个。
svnlook log %REPOS% -t %TXN% | findstr .......... > nul

更高级的选项可以让你在findstr命令中进行更复杂的检查(特定字符集等)。请查看此处了解更多信息。

1
代码中的关键在于 svnlook 行。为了使脚本正常工作,您需要确保正确设置了 svnlook 命令的路径。 - Corey Downie
我不知道你所说的svnlook正确路径的意思。 - PositiveGuy
那么您要指定哪个交易ID,还是这是Subversion运行此钩子时填充的占位符? - PositiveGuy
5
是的,使用该脚本,100个字符就等于100个点。但你只需要执行一次...你需要确保在svn服务器上,在命令提示符中输入"svnlook"时会发生某些事情。svnlook是一个命令行工具,根据你的系统PATH变量设置的方式不同,你可能需要像"c:\Program Files...\svnlook"这样的路径才能使脚本正常工作。1%和%2读取从svn传递给挂钩的参数,并将其分配给REPOS、TSN变量以备后用。 - Corey Downie
@CoreyDownie,你的解决方案只能在服务器上运行吗?我尝试在客户端运行它,但总是收到错误消息“svnlook: E720003: 无法打开文件'C:\ Users \ me \ AppData \ Local \ Temp \ svnFF1C.tmp \ format':系统找不到指定的路径。” 命令行是“svnlook.exe log”C:\ Users \ me \ AppData \ Local \ Temp \ svnFF1C.tmp“-t”3“”,很奇怪。 - fifth
显示剩余7条评论

2
我使用SubversionNotify,它可能比你需要的功能更多,但设置非常简单。

看了一下,但没有发现限制评论的方式,也没有任何正则表达式语法指导如何在这个应用程序中实现。 - PositiveGuy

2
在Windows系统上,你可以使用VisualSVN Server自带的VisualSVNServerHooks.exe check-logmessage预提交钩子,在%VISUALSVN_SERVER%bin目录下找到。这个简单的工具将帮助你定义日志信息中最少允许的字符数量。
请参考文章KB140: 在VisualSVN Server中验证提交日志信息获取详细指导。

这适用于VisualSVN 3.9及以上版本。如果您的版本低于3.9,您需要寻找其他解决方案。 - Stewart

2
我有一个pre-commit hook,可以完全满足您的要求。还有更多功能。
  • 您可以指定提交注释的最小长度。
  • 您可以将提交注释与正则表达式匹配。您不仅可以指定长度,还可以指定特定参数。例如,提交注释是否包含您的缺陷跟踪系统使用的错误编号,以便您可以将更改追溯到特定缺陷?

它还允许您执行以下操作:

  • 针对特定文件或目录设置不同的提交权限:
    • 读写:用户可以检出和提交这些项目。
    • 只读:用户可以检出此项目,但无法提交更改。
    • 仅添加:用户可以通过 svn cp 添加目录,但不能提交任何更改。这非常适合用于 /tags 目录,您可以在其中创建标记,但不能修改标记。
    • 不可删除:用户可以提交更改并添加新文件,但不能删除这些文件。
    • 不可添加:用户只能提交更改,不能在提交中添加或删除文件。

它还允许您执行以下操作:

  • 通过globbing的正则表达式禁止某些文件名;
  • 要求某些文件或目录具有特定属性设置为特定值。非常有用,例如确保Unix shell脚本、Unix Makefile和Windows批处理文件具有正确的行结尾,或者设置svn:ignore,以便用户不会意外提交不应该提交的文件。
  • 要求设置某些修订属性为特定值。这是如何检查提交消息的方式,但需要指定svn:log必须匹配某些正则表达式。

此预提交脚本是用Perl编写的。默认情况下,Perl随Unix、Mac和Linux服务器一起提供。不幸的是,它没有包含在Windows计算机中。幸运的是,有几个开源、免费且易于安装的Perl软件包可用于PC,例如ActivePerlStrawberry Perl


0

试试这个:

rem Make sure that the log message contains some text.
set REPOS=%1
set TXN=%2

"C:\Program Files\Subversion\bin\SVNlook.exe" log -t %TXN% %REPOS% | FindStr [a-zA-Z0-9]  
IF %ERRORLEVEL% EQU 0 GOTO OK  
echo Your commit has been blocked because you didn't provide a log message 1>&2  
echo Please write a log message describing the purpose of your changes and 1>&2  
echo then try committing again. -- Thank you 1>&2   
exit 1  

:OK  
rem -------------------------------------------------------------  
rem Check if comment is in list of reserved words to not be used..  
rem -------------------------------------------------------------  

"C:\Program Files\Subversion\bin\SVNlook.exe" log -t %TXN% %REPOS% >comment  
setlocal enabledelayedexpansion  
Set SEPARATOR=  
set COMMENT=  
for /f "delims=" %%a in (comment) do (      
    set currentline=%%a  
    set COMMENT=!COMMENT!%SEPARATOR%!currentline!  
)  

FIND "%COMMENT%" "C:\Program Files\Subversion\excludedwords.txt">Null  
If %ERRORLEVEL% EQU 1 goto OK2  

:Fail  
echo Your commit has been blocked because the single word comment you provided is not allowed 1>&2  
echo Line is -%COMMENT%- 1>&2  
echo Please write a proper log message describing the purpose of your changes and 1>&2  
echo then try committing again. -- Thank you 1>&2   
exit 1  


:OK2  
rem -------------------------------------------------------------  
rem Check number of words on the line if = 2 then reject comment  
rem -------------------------------------------------------------  
Set VAR1=%COMMENT%  
Set count=0  
For %%j in (%VAR1%) Do Set /A count+=1  
IF %count% EQU 2 goto Fail2  
goto OK3  

:Fail2  
echo Your commit has been blocked because not enough detail supplied 1>&2  
echo Please write a longer log message describing the purpose of your changes and 1>&2  
echo then try committing again. -- Thank you 1>&2   
exit 1  

:OK3  
rem -------------------------------------------------------------  
rem Check that the author of this commit has the rights to perform  
rem -------------------------------------------------------------  
rem the commit on the files and directories being modified.  
rem commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1  

rem All checks passed, so allow the commit.  
exit 0  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接