Svn Subversion提交后钩子

Svn Subversion提交后钩子,svn,visualsvn-server,post-commit,svn-hooks,Svn,Visualsvn Server,Post Commit,Svn Hooks,我在使用提交后挂钩时遇到一些问题。当我将更改的文件提交到存储库时,Subversion似乎没有触发提交后挂钩 我在Subversion中使用了OrtoiseSVN和VisualSVN,我能够进入VisualSVN用户界面并在其中创建一个钩子,该钩子工作正常,但是我想做的是使用我安装的hooks文件夹中的post-commit可执行钩子来执行我的钩子 我已经在我的存储库的/hooks文件夹中将名称从post commit.tmpl更改为post commit.bat,我只是在批处理文件中做了一个简

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

我在Subversion中使用了OrtoiseSVN和VisualSVN,我能够进入VisualSVN用户界面并在其中创建一个钩子,该钩子工作正常,但是我想做的是使用我安装的hooks文件夹中的post-commit可执行钩子来执行我的钩子

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

"C:\Program Files\TortoiseSVN\bin\svn.exe" update "C:\mypath\myworkingcopy"
当我独自运行批处理文件时,它会更新我的工作文件夹,因此我认为由于某种原因提交时不会触发它。这似乎不是权限问题,因为所有操作都是在我的机器上本地完成的,但我已将其设置为作为网络服务运行,但仍然遇到相同的问题…有什么建议吗?

  • 为网络服务帐户提供访问工作副本文件夹
    C:\mypath\myworkingcopy
    C:\Program Files\TortoiseSVN\bin\svn.exe
    的权限

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

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

    调用“%~dp0post-commit run.bat”%*>%1/hooks/post-commit.log 2>&1
  • 提交到存储库并检查生成的日志文件。输出将为您提供有关根本原因的线索

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

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

使用能够响应提交事件并在提交后钩子之外执行复制更新或web服务器部署之类的操作的东西要好得多。我强烈推荐你做这份工作。詹金斯有几个很好的特点:

  • 它的成本效益(你无法击败免费)
  • 它得到了很好的支持(在Stackoverflow上发布一个问题并获得快速响应)
  • 这是一个快速设置和使用

现在回到你的问题:


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

 exit 2
这将使Subversion认为post-commit钩子已经失败,您应该在提交时收到一条错误消息。否则,您的提交后脚本将不会运行。确保运行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!"
钩子应该删除环境(包括路径),但我想这只是在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
是否在其中


我现在想不出还有什么别的办法。

大卫答案的扩展版

  • 检查是否确实执行了post-commit钩子:添加到post-commit.bat
    echo ANYTHING
    ,从CLI提交时,您必须看到输出到屏幕上的任何内容(如果TSVN处于提交窗口中)
  • 如果执行了钩子脚本(必须如此),您必须测试运行VisualSVN服务器的帐户的权限(对于工作副本目录),NetworkService可能没有足够的文件权限-我怀疑这是因为任何svn更新,即使是最新的WC,输出到stdout,您必须从post-commit钩子中查看此输出
  • >svn up“z:\wc”

    更新“wc”:

    第3版。


    编辑和修复

    感谢大卫提到我愚蠢的错误和令人耳目一新的记忆。而bahrep与fil的版本
    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.
    
    #!/bin/sh
    /bin/touch /home/folder/post_commit_works