-->

颠覆后commit钩子(Subversion Post-Commit Hooks)

2019-08-31 08:00发布

我有一些问题让post-commit的钩子工作。 颠覆似乎并不被触发我的post-commit钩子时,我犯了改变的文件到我的仓库。

我使用TortoiseSVN和的VisualSVN使用Subversion,我能够进入的VisualSVN用户界面,并创建但是这工作,我想要做的就是使用后提交可执行钩在我安装到钩夹什么内有一个挂钩执行我的钩。

我从更名post-commit.tmplpost-commit.bat在我的仓库的/钩子文件夹,我只是在做批处理文件中一个简单的更新:

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

当我运行它自己的批处理文件,它更新我的工作文件夹,所以我想这时候我犯了某些原因没有被触发。 它不似乎是一个权限问题,因为一切都被本地完成我的机器上,但是我已经将它设置为运行作为网络服务,但仍然遇到同样的问题......有什么建议?

Answer 1:

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

其次重要的是,这是不好的形式,可能会花费太多时间的钩子做任何事情。 如果你的钩子需要的东西超过svnlook ,没准你就错了。 例如,多久可以采取以更新的工作副本? 10秒? 30秒? 一分钟? 这是增加的时间开发者坐下来,等待他们的Subversion提交完成。

这是好得多使用的东西,可以应对提交事件,并有不喜欢的东西的工作副本更新或部署到Web服务器的一个post-commit钩子之外。 我强烈建议詹金斯这项工作。 詹金斯有几个不错的功能:

  • 它的成本效益(你不能击败免费)
  • 这是很支持(POST#2提问,并得到快速响应)。
  • 这是一个卡扣安装和使用。

现在回到你的问题:

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

 exit 2

这将使颠覆认为,提交后钩子已经失败,你应该得到上犯的一个错误消息。 如果没有,您的文章提交脚本不运行。 确保脚本是可执行的由正在运行的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!"

钩子应该去除环境(包括路径),但我想这是只有在Unix和不是Windows。 你可以看到PATHEXT定义。

然后我改名pre-commit.batpre-commit.tmpl和创建后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就在那里。

我想不出别的合适的副手。



Answer 2:

我几乎疯了这个问题,我的问题是,2号出口,未在提交后到我的svn客户端发送任何数据。 它是在工作的良好开始提交,预提交,但在提交后,我从来没有得到任何错误。 所以我的主要问题是在脚本本身只是完整路径调用。

所以,如果它似乎你,提交后是从来没有工作,而你试图退出1剧本,你得到任何错误,尝试是这样的:

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


Answer 3:

  • 提供网络服务帐户可以访问工作拷贝的文件夹C:\mypath\myworkingcopyC:\Program Files\TortoiseSVN\bin\svn.exe

  • 如果它不工作,那么让我们捕捉钩输出到日志文件,以获取有关根源一些端倪:

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

      所说的 “%〜dp0post提交-run.bat中” %*>%1 /钩/后commit.log 2>&1

    3. 提交到库,并检查生成的日志文件。 输出西港岛线给大家介绍的根本原因的线索。



Answer 4:

大卫的回答加长版

  1. 检查中,post-commit钩子真正执行:加入到后commit.bat echo ANYTHING并从CLI提交你一定要看到什么output'ed屏幕(在TSVN的情况下,将在提交窗口)
  2. 如果挂机脚本执行(它必须如此),您必须将帐户的测试权限(工作拷贝的目录),在其下运行VisualSVN服务器-网络服务可能没有足够的权限的文件-我怀疑这一点,因为任何SVN更新,甚至长达最新WC,输出到标准输出,你一定要看看从你的post-commit钩子此输出

>svn up "z:\wc"

Updating 'wc':

At revision 3.


编辑和修正

感谢David提我的愚蠢的错误,并刷新内存。 虽然bahrep与文件记录的版本将工作,这种类型的post-commit钩子(同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.


Answer 5:

这样做,当我有同样的问题post-commit.bat 。 我想颠覆在Windows上运行时,脚本后提交.exe为扩展名。

尝试编译您的批处理后提交到可执行文件Bat2Exe或bat2exe.net ,看看是否运行。



文章来源: Subversion Post-Commit Hooks