首页 文章

SVN预提交问题

提问于
浏览
2

我在网上发现了这个脚本,很少有人说他们正在为他们的存储库工作 . 该脚本允许预先提交检查以在检查时强制检查注释 . 问题是我将它添加到SVN中的hooks目录,现在所有提交(甚至是带注释的提交)都失败并显示此错误消息 "Commit blocked by pre-commit (exit code 255) with no output"

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

#!/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 回答

  • 3

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

    • 脚本顶部的shebang不正确 . 也许在您的系统上,没有BASH shell或BASH shell位于/ usr / local / bin / bash或/ usr / share / bin / bash . 不太可能在Linux系统上,但很可能在Solaris上 . 检查一下 .

    • 该脚本没有设置可执行位 . 您需要在脚本上执行 chmod +x .

    • 预提交shell脚本无法调用脚本本身 . 看一下hook目录中的 pre-commit 脚本,确保's calling your script. Or, that you'已将脚本重命名为 pre-commit 并将其放在该目录中 .

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

    这是我的pre-commit hook . 它's in Perl, so it works with both Windows and Unix/Linux/Mac. You'必须在你的Windows机器上安装ActivePerlStrawberry Perl,但两者都是免费的和开源的 .

    我的预提交脚本可以做几件事,比如确保人们不会通过允许人们创建标签而不是修改标签来意外更改标签 .

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

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

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

    在预提交脚本中,您只需检查空注释 . 如果您的开发人员开始收到 changed codeadaadsdasdasda 之类的评论,只是为了让提交能够通过 . 像Jenkins这样的东西,开发人员实际上开始自己提交好的提交评论 .

  • 5

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

    ls -l pre-commit

    注意它也必须由服务于你的svn repo的进程执行,在我的例子中是httpd .

相关问题