2

我在网上找到了这个脚本,很少有人说它适用于他们的存储库。该脚本是允许预提交检查以在检查时强制检查注释。问题是我将它添加到 SVN 中的钩子目录中,现在所有提交(甚至是带有注释的提交)都失败并显示此错误消息 “提交被预提交(退出代码 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

4

2 回答 2

5

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

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

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

这是我的预提交钩子。它在 Perl 中,因此它适用于 Windows 和 Unix/Linux/Mac。你必须在你的 Windows 机器上安装ActivePerlStrawberry Perl,但它们都是免费和开源的。

我的预提交脚本可以做一些事情,例如通过允许人们创建标签而不是修改标签来确保人们不会意外更改标签。

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

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

Jenkins 的最大优势在于它提供了一个漂亮的网页,其中包含各种信息,例如谁进行了更改以及他们进行了哪些更改。开发人员发现这很有帮助,以至于他们会自动开始在没有被询问的情况下添加好的提交评论。令人惊奇的是,我可以查看 Subversion 更改日志并确定我开始使用 Jenkins 的确切时间。

在您的预提交脚本中,您只需检查空注释。如果您的开发人员不想发表评论,您将开始收到类似的评论,changed code并且adaadsdasdasda只是为了让提交通过。使用 Jenkins 之类的东西,开发人员实际上开始自己添加良好的提交评论。

于 2012-01-30T17:33:18.597 回答
3

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

ls -l 预提交

请注意,它还必须可以由为您的 svn 存储库提供服务的进程执行,在我的情况下为 httpd。

于 2012-01-30T14:18:44.673 回答