Subversion Post-Commit Hooks

时间:2013-04-16 14:52:00

标签: svn visualsvn-server post-commit svn-hooks

我在使用post-commit hooks时遇到了一些问题。当我将更改的文件提交到我的存储库时,Subversion似乎没有触发我的post-commit挂钩。

我正在使用TortoiseSVN和VisualSVN与Subversion,我能够进入VisualSVN用户界面并在那里创建一个钩子,但是我想要做的是使用钩子文件夹中的post-commit可执行钩子我的安装执行我的钩子。

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

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

  • 这是符合成本效益的(你不能免费)
  • 支持得很好(在Stackoverflow上发布一个问题并快速回复)。
  • 设置和使用非常简单。

现在回到你的问题:

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

 exit 2

这将使Subversion认为后提交挂钩失败,您应该在提交时收到错误消息。如果没有,您的提交后脚本不会运行。确保脚本可由运行Subversion服务器的帐户执行。

如果收到错误消息,则脚本正在运行。但是,svn命令可能不会返回由提交后进程获取的错误。由于其局限性,我通常不建议在Windows批处理编程语言中编写钩子。使用Python或Perl或PowerShell。这些更好地检测错误条件,您可以在检测到时退出脚本。

然后,情况正常,但你正在查看错误的工作副本(机器上的那个,而不是服务器上的那个)。当您在subversion服务器外部运行挂钩进行测试时,请在服务器上以运行服务器进程的Subversion用户身份运行它们。

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


其他评论

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

我进入hooks目录,将pre-commit.tmpl重命名为pre-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.bat重命名为pre-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是否在那里。

我无法想到其他任何事情。

答案 1 :(得分:2)

我几乎为此疯狂,我的问题是退出2,在提交后我的svn客户端没有发送任何内容。它在start-commit,pre-commit中运行良好,但在post-commit中,我从来没有收到任何错误。所以我的主要问题只是脚本本身的完整路径调用。

因此,如果您认为提交后的内容永远不会正常工作,并且您尝试了脚本中的退出1并且没有出现任何错误,请尝试以下操作:

#!/bin/sh
/bin/touch /home/folder/post_commit_works

答案 2 :(得分: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.   
    4. 提交存储库并检查生成的日志文件。输出结果将为您提供有关根本原因的线索。
    5.   

答案 3 :(得分:1)

大卫答案的扩展版

  1. 检查,提交后挂钩是否真正执行:添加到post-commit.bat echo ANYTHING并从CLI提交后,您必须看到任何输出到屏幕(如果TSVN将在提交中)窗口)
  2. 如果执行了hook-script(必须如此),则必须测试帐户的权限(对于Working Copy目录),在该帐户下运行VisualSVN Server - NetworkService可能没有足够的文件权限 - 我怀疑这一点,因为任何svn更新,即使是最新的WC,也输出到stdout,你必须从你的提交后挂钩看到这个输出
  3. >svn up "z:\wc"

    Updating 'wc':

    At revision 3.


    编辑和修复

    感谢David提到我的愚蠢错误和清新记忆。虽然bahrep的文件记录版本可行,但这种类型的post-commit钩子(在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.
    

答案 4 :(得分:1)

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

尝试使用Bat2Exebat2exe.net将批量后提交编译为可执行文件,看看是否会运行。