如何防止没有注释的Subversion提交?


67

没有输入任何提交注释时,有人知道如何防止提交到Subversion代码存储库吗?


15
请注意,钩子只能防止不加注释的意外提交。除非您教育您的用户,否则他们只会提交诸如“修复错误”之类的东西,这与空消息无关。
Thilo

1
我同意锡洛。如果您打算在不加评论的情况下防止错误,那么此处提供的解决方案将起作用。如果您希望通过强迫用户发表评论来强迫用户提供有意义的评论,则他们将在所有提交中编写“修复错误”和“新功能”。这是文化问题。
GmonC

1
同意,这是最重要的。

1
是的,您不能强迫用户写出有意义的评论甚至可以理解。但是,强迫他们写一些东西,而不是徒劳地发送提交,这对我的经验很有帮助。对于那些只写“固定”之类的人,人与人之间的聊天可能会走很长一段路。如果这样做没有帮助,请考虑在湿件中寻找替代品。
jramb

Answers:


64

您可以使用一个钩子(将其放入<repository>/hooks并命名pre-commit.bat(Windows)):

@echo off
::
:: Stops commits that have empty log messages.
::

setlocal

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

rem check for an empty log message
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 give any 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

src:http//www.anujgakhar.com/2008/02/14/how-to-force-comments-on-svn-commit/


5
+1,尽管这当然不能强迫用户使用有意义的评论。svn commit -m“ foo” foo.h仍然可以工作。
格伦(Glen)

>> nul是什么意思?目的是什么?
bahrep

太好了,这个钩子是在客户端还是在服务器端工作?理想情况下,我希望它在服务器端起作用,以防止每个人都提交而没有提交消息。
vatsug

22

这是带有@miku针对Linux的详细错误消息的预提交钩子:

#!/bin/sh

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null

GREP_STATUS=$?
if [ $GREP_STATUS -ne 0 ]
then
    echo "Your commit has been blocked because you didn't give any 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
fi
exit 0

提示:重命名pre-commit.tmpl进行预提交
Arthur Wu,

18

实际上,当您创建Subversion存储库时,其hooks子目录已包含挂钩示例。签出一个pre-commit.tmpl有关钩子参数的详细信息。它还包含您要查找的钩子的示例:

#!/bin/sh
REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || exit 1

您可以使用任何脚本或语言来编写钩子,只要它在Subversion机器上是可执行的即可。


这对我在具有UberSVN的Ubuntu上有效。尽管我需要将SVNLOOK指向/opt/ubersvn/bin/svnlook
Nam G VU

1
我还必须sudo chmod 777 pre-commit使它起作用。否则,所有提交都将被拒绝。
Nam G VU

2
@NamGiVU 777不能轻易使用,如果正确设置了所有者,则只需在文件上使用700或750即可使用。
Shadok

谢谢@Shadok。虽然我不知道the owner is correct。如果您可以指出更多信息,将很好
Nam G VU 2012年

2
@NamGiVU您应该花一两天的时间阅读linux上的常规文档,因为您似乎缺乏一些基本技能(没有冒犯性),请在此处查看有关文件发行和许可的快速课程:code.google.com/edu/ tools101 / LINUX / ownership_permissions.html
Shadok

8

如果仅使用TortoiseSVN,则可以将TortoiseSVN的属性添加到根目录:属性名:tsvn:logminsize value:1 这将禁用TortoiseSVN提交窗口中的“确定”按钮,然后消息为空。请注意,此属性是TortoiseSVN特定的,它可能无法与其他SVN客户端一起使用。


6

创建一个预提交的钩子。下面是一些指令就怎么做你自己,或者这里是一个示例钩子脚本,将拒绝提交信息超过10个字符短的东西。


1
大!工作正常,我只需要更改python和svnlook的位置。
Nux

1
拒绝任何短于10个字符的示例挂钩脚本的链接已断开。
tgharold 2012年

2
这个答案有点“仅链接”。您不能将挂钩示例的内容放入答案中吗?
利亚姆2014年

6

超过15个字符的Linux脚本-

#!/bin/bash
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
# Comments should have more than 5 characters
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS" | grep [a-zA-Z0-9] | wc -c)
if [ "$LOGMSG" -lt 15 ];
then
echo -e "Please provide a meaningful comment when committing changes." 1>&2
exit 1
fi

来源-http : //java.dzone.com/articles/useful-subversion-pre-commit

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.