Subversion Post-Commit Hooks

mgr*_*ier 2 svn post-commit visualsvn-server svn-hooks

我有一些问题让post-commit钩子工作.当我将更改的文件提交到我的存储库时,Subversion似乎没有触发我的post-commit钩子.

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

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

"C:\Program Files\TortoiseSVN\bin\svn.exe" update "C:\mypath\myworkingcopy"
Run Code Online (Sandbox Code Playgroud)

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

Dav*_* W. 6

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

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

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

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

现在回到你的问题:

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

 exit 2
Run Code Online (Sandbox Code Playgroud)

这将使Subversion认为后提交挂钩失败,您应该在提交时收到错误消息.如果没有,您的提交后脚本不会运行.确保脚本可由运行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
Run Code Online (Sandbox Code Playgroud)

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

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!"
Run Code Online (Sandbox Code Playgroud)

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

然后我改名pre-commit.bat,以pre-commit.tmpl创造一个后commit.bat`,看起来像这样:

echo This post-commit hook shall fail! 1>&2
exit 2
Run Code Online (Sandbox Code Playgroud)

在提交期间,我得到以下内容:

Transmitting file data .
Committed revision 3.

Warning: post-commit hook failed (exit code 2) with output:
This post-commit shall fail!
Run Code Online (Sandbox Code Playgroud)

看起来一切都按计划进行.我没有使用VisualSVN,而且我不是作为服务运行的.我想知道你的PATHEXT环境变量是否存在问题.

也许看看你的帐户是如何设置运行Subversion服务器并查看是否.BAT在那里.

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

  • @LazyBadger除非钩子失败,否则在钩子内回调将不起作用.Subversion使用STDOUT并且只在挂钩失败时才打印STDERR.将"exit 2"添加到底部将让您知道挂钩是否正在运行.记住,这是一个单线钩子.回应并不会告诉你太多.我想尽量保持这个简单. (2认同)