SVN预提交问题

时间:2011-09-06 21:51:43

标签: svn pre-commit-hook

我在网上找到了这个脚本,很少有人说他们正在为他们的存储库工作。 该脚本允许预先提交检查以在检查时强制检查注释。 问题是我将它添加到SVN中的hooks目录,现在所有提交(甚至是带注释的提交)都失败并显示此错误消息  “提交被预提交阻止(退出代码255)没有输出”

现在,我无法更改脚本或删除它,因为我收到相同的错误。有关如何还原此预提交脚本的任何建议吗?

#!/bin/bash # [1] REPOS-PATH (the path to this repository) # [2] TXN-NAME (the name of the txn about to be committed) REPOS="$1" REV="$2" @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 # 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

2 个答案:

答案 0 :(得分:5)

这意味着它甚至没有执行你的钩子。每当你得到这样的错误时,它可能意味着几件事:

  • 脚本顶部的shebang不正确。也许在您的系统上,没有BASH shell或BASH shell位于/ usr / local / bin / bash或/ usr / share / bin / bash。不太可能在Linux系统上,但很可能在Solaris上。检查一下。
  • 脚本没有设置可执行位。您需要在脚本上执行chmod +x
  • 预提交shell脚本无法自行调用脚本。看一下hook目录中的pre-commit脚本,确保它正在调用你的脚本。或者,您已将脚本重命名为pre-commit并将其放在该目录中。

另一种可能性(仔细查看您的脚本)是您将pre-commit BASH脚本与Windows shell的pre-commit.bat版本混淆了。您的语法是脚本后半部分的Windows shell,但上半部分是BASH shell。

这是我的pre-commit hook。它在Perl中,因此它适用于Windows和Unix / Linux / Mac。您必须在Windows框中安装ActivePerlStrawberry Perl,但这两者都是免费且开源的。

我的预提交脚本可以执行多项操作,例如确保人们不会通过允许人们创建标记而不会修改标记而意外更改标记。

我的脚本还允许使用提交注释进行更多检查。例如,您使用错误跟踪系统吗?您可以设置我的钩子以在提交注释中要求错误跟踪ID。

另一种可能性(我真正推荐的是)使用像Jenkins这样的连续构建工具。 Jenkins自动执行构建,并将在每次提交时运行测试。这可以确保尽早发现错误而不是说后期制作。

Jenkins的一大优势在于它提供了一个漂亮的网页,其中包含各种信息,例如谁做出了更改以及他们做了哪些更改。开发人员发现这非常有用,他们会自动开始提交好的提交注释,而不会被问到。令人惊讶的是,我可以通过Subversion更改日志并确定我开始使用Jenkins的确切时刻。

在预提交脚本中,您只需检查空注释。如果您的开发人员不想发表评论,您将开始收到 changed code adaadsdasdasda 之类的评论,以便允许提交经过。像Jenkins这样的东西,开发人员实际上开始自己提交好的提交评论。

答案 1 :(得分:3)

您是否检查过预提交是否已设置为可执行文件。

ls -l pre-commit

请注意,它必须也可以由服务于您的svn repo的进程执行,在我的情况下为httpd。