2

我在让提交后挂钩工作时遇到了一些问题。当我将更改的文件提交到我的存储库时,Subversion 似乎没有触发我的提交后挂钩。

我正在使用带有 Subversion 的 TortoiseSVN 和 VisualSVN,我能够进入 VisualSVN 用户界面并在其中创建一个有效的挂钩,但是我想做的是使用我安装的 hooks 文件夹中的 post-commit 可执行挂钩来执行我的钩子。

我已将存储库的 /hooks 文件夹中的名称从更改为post-commit.tmplpost-commit.bat并且只是在批处理文件中进行了简单的更新:

"C:\Program Files\TortoiseSVN\bin\svn.exe" update "C:\mypath\myworkingcopy"

当我自己运行批处理文件时,它会更新我的工作文件夹,所以我认为当我出于某种原因提交时它不会被触发。这似乎不是权限问题,因为一切都是在我的机器上本地完成的,但是我已将其设置为作为网络服务运行但仍然遇到同样的问题......有什么建议吗?

4

5 回答 5

6

首先,所有的钩子都是在服务器上执行的,而不是在不同的客户端机器上。是C:\mypath\myworkingcopy在服务器上吗?如果没有,它不会得到更新。

其次,在钩子中做任何可能需要太多时间的事情都是不好的形式。如果你的钩子需要的东西超过svnlook,你很可能做错了。例如,更新该工作副本需要多长时间?10秒?30秒?一分钟?这是开发人员必须坐下来等待他们的 Subversion 提交完成的额外时间。

使用可以响应提交事件并在提交后挂钩之外执行诸如工作副本更新或部署到 Web 服务器之类的事情要好得多。我强烈推荐詹金斯做这份工作。Jenkins 有几个不错的特性:

  • 它具有成本效益(你不能免费)
  • 它得到了很好的支持(在 Stackoverflow 上发布问题并获得快速回复)。
  • 设置和使用非常简单。

现在回到你的问题:

首先确保钩子正在运行。将这一行添加到批处理脚本的底部:

 exit 2

这会让 Subversion 认为 post-commit 钩子失败了,你应该在提交时收到一条错误消息。如果没有,您的提交后脚本没有运行。确保脚本可由运行 Subversion 服务器的帐户执行。

如果确实收到错误消息,则脚本正在运行。但是,svn 命令可能不会返回提交后进程发现的错误。我通常不建议使用 Windows 批处理编程语言编写钩子,因为它的局限性。使用 Python 或 Perl 或 PowerShell。这些更适合检测错误情况,并且您可以在检测到时退出脚本。

话又说回来,一切运行良好,但您正在查看错误的工作副本(您机器上的那个,而不是服务器上的那个)。当您在 subversion 服务器之外运行挂钩进行测试时,请以运行服务器进程的 Subversion 用户身份在服务器上运行它们。

尝试这些方法,看看是否能解决您的问题。


附加评论

我创建了一个存储库svnadmin create并使用svnserve. 我更新svnserve.conf以允许我签出和提交代码。

我进入hooks目录,重命名pre-commit.tmplpre-commit.bat并将其设置为:

set 1>&2
echo "Blocked my me!" 1>&2
exit 2

当我尝试提交更改时,我得到了:

Transmitting file data .svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 2) with output:
[...]
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW
PERL_JSON_BACKEND=JSON::XS
PERL_YAML_BACKEND=YAML
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2a07
[...]
"Blocked my me!"

该钩子应该删除环境(包括PATH),但我猜这只是在Unix而不是Windows上。你可以看到PATHEXT定义。

然后我重命名pre-commit.batpre-commit.tmpl创建了一个 post-commit.bat ,如下所示:

echo This post-commit hook shall fail! 1>&2
exit 2

在提交期间,我得到以下信息:

Transmitting file data .
Committed revision 3.

Warning: post-commit hook failed (exit code 2) with output:
This post-commit shall fail!

看起来一切都按计划进行。我没有使用 VisualSVN,也没有作为服务运行。PATHEXT我想知道您的环境变量是否有问题。

也许看看它是如何在您运行 Subversion 服务器的帐户上设置的,看看是否.BAT在那里。

我不能马上想到其他任何事情。

于 2013-04-16T19:42:55.403 回答
2

我几乎为此发疯了,我的问题是出口 2,在提交后没有向我的 svn 客户端发送任何内容。它在开始提交,预提交中运行良好,但在提交后,我从未收到任何错误。所以我的主要问题只是脚本本身的完整路径调用。

因此,如果在您看来 post-commit 永远无法正常工作,并且您在脚本中尝试了 exit 1 并且没有收到任何错误,请尝试以下操作:

#!/bin/sh
/bin/touch /home/folder/post_commit_works
于 2013-10-01T13:40:16.133 回答
1

大卫答案的扩展版

  1. 检查,提交后挂钩是否真正执行:添加到 post-commit.batecho ANYTHING并在从 CLI 提交时,您必须看到任何输出到屏幕(如果 TSVN 输入将在提交窗口中)
  2. 如果执行了钩子脚本(必须如此),您必须测试运行 VisualSVN 服务器的帐户的权限(对于工作副本目录) - NetworkService 可能对文件的权限不足 - 我怀疑这一点,因为任何 svn更新,即使是最新的 WC,输出到标准输出,你必须从你的 post-commit 钩子中看到这个输出

>svn up "z:\wc"

Updating 'wc':

At revision 3.


编辑和修复

感谢大卫提到我的愚蠢错误和令人耳目一新的记忆。虽然 bahrep 的文件记录版本可以工作,但这种类型的提交后挂钩(在 post-commit.bat 中)

echo Running 1>&2
svn up "z:\wc-auto" 1>&2
exit 2

在提交时将所有钩子的输出传输到屏幕

z:\wc>svn ci -m "Testing hook"
Sending        file.txt
Transmitting file data .
Committed revision 13.

Warning: post-commit hook failed (exit code 2) with output:
Running
Updating 'Z:\wc-auto':
U    Z:\wc-auto\file.txt
Updated to revision 13.
于 2013-04-16T21:02:11.117 回答
1
  • 为网络服务帐户提供对工作副本文件夹C:\mypath\myworkingcopyC:\Program Files\TortoiseSVN\bin\svn.exe.

  • 如果它不起作用,那么让我们将钩子输出捕获到日志文件中以获取有关根本原因的一些线索:

    1. 将当前post-commit.bat文件重命名为post-commit-run.bat.
    2. 创建以下文件作为您的post-commit.bat文件:

      调用 "%~dp0post-commit-run.bat" %* > %1/hooks/post-commit.log 2>&1

    3. 提交到存储库并检查生成的日志文件。输出将为您提供有关根本原因的线索。

于 2013-04-16T16:45:39.953 回答
1

我在做的时候遇到了同样的问题post-commit.bat.exe我认为当脚本具有扩展名时,Windows 上的 Subversion 会在提交后运行。

尝试使用Bat2Exebat2exe.net将您的批处理 post-commit 编译成可执行文件,看看它是否运行。

于 2013-07-02T13:33:38.070 回答