首先,所有的钩子都是在SERVER上执行的,而不是在不同的客户端机器上。是服务器上的C:\mypath\myworkingcopy 吗?如果没有,它不会得到更新。
其次,在钩子中做任何可能需要太多时间的事情都是不好的形式。如果您的钩子需要的不仅仅是svnlook,那么您可能做错了。例如,更新该工作副本需要多长时间? 10秒? 30秒?一分钟?这是开发人员必须坐下来等待 Subversion 提交完成的额外时间。
使用可以响应提交事件并在提交后挂钩之外执行诸如工作副本更新或部署到 Web 服务器之类的事情要好得多。我强烈推荐Jenkins 做这份工作。 Jenkins 有几个不错的功能:
- 它具有成本效益(你不能免费)
- 得到很好的支持(在 Stackoverflow 上发布问题并获得快速回复)。
- 设置和使用非常简单。
现在回到你的问题:
首先确保钩子正在运行。在批处理脚本的底部添加这一行:
exit 2
这会让 Subversion 认为 post-commit 钩子失败了,你应该在提交时收到一条错误消息。如果没有,您的提交后脚本没有运行。确保脚本可由运行 Subversion 服务器的帐户执行。
如果您确实收到错误消息,则脚本正在运行。但是,svn 命令可能不会返回提交后进程发现的错误。我通常不推荐使用 Windows 批处理编程语言编写钩子,因为它的局限性。使用 Python 或 Perl 或 PowerShell。这些更适合检测错误情况,并且您可以在检测到时退出脚本。
再一次,一切运行良好,但您查看的工作副本有误(您机器上的那个,而不是服务器上的那个)。当您在 subversion 服务器之外运行 hooks 进行测试时,请以运行服务器进程的 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 是否在其中。
我想不出其他任何事情。