首先,所有的钩子都是在服务器上执行的,而不是在不同的客户端机器上。是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.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
在那里。
我不能马上想到其他任何事情。