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

Posted

技术标签:

【中文标题】如何防止没有注释的 Subversion 提交?【英文标题】:How can I prevent Subversion commits without comments? 【发布时间】:2010-12-28 00:48:45 【问题描述】:

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

【问题讨论】:

请注意,钩子只能防止没有 cmets 的意外提交。除非您教育您的用户,否则他们只会提交类似“修复错误”之类的内容,这对空消息没有任何好处。 我同意蒂洛的观点。如果您的目的是防止在没有 cmets 的情况下提交错误,那么此处提供的解决方案将起作用。如果您希望通过强制用户发表评论来强制用户提供有意义的 cmets,他们将在所有提交中编写“修复错误”和“新功能”。这是一个文化问题。 同意,这是最重要的。 是的,你不能强迫用户写有意义的cmets,甚至是可以理解的。但是强迫他们写东西而不是无脑地发送提交对我的经验有很大帮助。而对于那些只写“固定”之类的人来说,人与人之间的聊天可以走很长一段路。如果这没有帮助,请考虑在湿件中寻找替代品。 【参考方案1】:

如果您只使用 TortoiseSVN,那么您可以将 TortoiseSVN 的属性添加到根目录: 属性名称:tsvn:logminsize 值:1 这将禁用 TortoiseSVN 提交窗口中的 OK 按钮,然后 Message 为空。 请注意,此属性是 TortoiseSVN 特有的,它可能不适用于其他 SVN 客户端。

【讨论】:

【参考方案2】:

超过 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

【讨论】:

【参考方案3】:

您可以使用钩子(将其放入<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

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

【讨论】:

+1,当然这不能强迫用户使用有意义的 cmets。 svn commit -m "foo" foo.h 仍然可以工作。 ` > nul` 部分有什么用?它的目的是什么? 太好了,这个钩子是在客户端还是服务器端工作?理想情况下,我希望它在服务器端工作,以防止每个人在没有提交消息的情况下提交。【参考方案4】:

这是一个预提交钩子,其中包含@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 重命名为 pre-commit【参考方案5】:

实际上,当您创建 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 我还必须sudo chmod 777 pre-commit 才能让它工作;否则,所有提交都会被拒绝。 @NamGiVU 777 不应轻易使用,如果所有者设置正确,您只需在文件上使用 700 或 750 即可。 谢谢@Shadok。虽然我不知道the owner is correct。如果您能指出更多,那就太好了 @NamGiVU 您应该花一两天时间阅读有关 linux 的一般文档,因为您似乎缺乏一些基本技能(无意冒犯),请在此处查看有关文件 onwership 和权限的快速课程: code.google.com/edu/tools101/linux/ownership_permissions.html【参考方案6】:

创建一个预提交挂钩。这里是 some instructions 说明如何自己执行此操作,或者 here 是一个示例钩子脚本,它将拒绝提交消息少于 10 个字符的任何内容。

【讨论】:

太棒了!工作正常,我只需要更改 python 和 svnlook 的位置。 拒绝任何短于 10 个字符的示例挂钩脚本的链接已损坏。 这个答案有点“仅链接”。你不能把钩子例子的内容放到答案里吗?

以上是关于如何防止没有注释的 Subversion 提交?的主要内容,如果未能解决你的问题,请参考以下文章

防止在正则表达式上回溯以查找非注释行(不以缩进的“#”开头)

如何获取所有 Subversion 提交作者用户名的列表?

text Git预提交挂钩(.git / hooks / pre-commit)以防止意外提交调试代码(在源注释中添加NOCOMMIT)

idea中项目如何提交代码到svn上

如何让Subversion与远程服务器(通过FTP)保持同步?

subversion如何在存储库中存储文件?