SVN预提交钩子

3

我目前正在尝试扩展我们已经存在(且正常工作)的预提交批处理文件,以用于提交到SVN。第一部分会阻止任何没有注释的提交,并按预期工作。第二部分是为了防止用户提交SUO文件,但目前它阻止了所有提交。

由于我的DOs脚本理解不太好,所以我怀疑可能是我的FindStr使用方式有误?

有人能帮忙吗?

"C:\Program Files\VisualSVN Server\bin\svnlook.exe" log -t %2 %1 | FindStr [a-zA-Z0-9]
IF %ERRORLEVEL% EQU 0 GOTO OK
echo "Commit Comments are Required" >&2
exit 1
:OK
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" diff -t %2 %1 | FindStr /R "[a-zA-Z]\.suo"
IF %ERRORLEVEL% EQU 0 exit 0
echo "SUO files cannot be committed" >&2
exit 1
2个回答

5

如果找到了内容,findstr返回0,如果没有找到则返回1。您的检查刚好相反了。

不需要批处理,即使在Windows上,shell也是交互式的,因此您可以实时尝试:

>dir | findstr ".sln"
15.01.2009  16:37            33.844 Project.sln

>echo %ERRORLEVEL%
0

>dir | findstr ".slngimpf"

>echo %ERRORLEVEL%
1

顺便提一下,写起来更容易。
if errorlevel 0 andthencontinuewithwhatever

这样,您的脚本也可以稳定地抵御不祥之兆:

set errorlevel=0

接下来这个操作将会摧毁使用 %errorlevel% 正确输出错误级别的任何未来尝试。

(编辑) 重要说明: 我忘记说 if errorlevel 语法检查错误级别是否大于或等于正在测试的值。 因此,为了正确使用它,您必须始终首先检查最高的错误,例如:

someCommand
if errorlevel 10 ...
if errorlevel 9 ...
if errorlevel 0 ...

3

也许不是你想要的答案,但你可以使用 global-ignores 选项来阻止所有*.suo文件。


被投票赞成,绝对不应该得到-1。 - Daniel Sloof
global-ignores是处理问题比pre-commit hooks更好的方法。虽然真正的解决方案是用一根木棍狠狠地敲打你的开发人员,直到他们学会为止。请参见http://sirhc.us/journal/2007/07/27/oscon-2007-subversion-worst-practices/。 - Ronny Vindenes

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