当前位置:  开发笔记 > 编程语言 > 正文

Mercurial钩子没有正确执行

如何解决《Mercurial钩子没有正确执行》经验,为你挑选了2个好方法。

这应该是一个非常简单的运行,但由于某种原因它不适用于我的Mercurial存储库.我想要的只是远程仓库hg update在有人推送时自动运行.所以我在.hg/hgrc文件中有这个:

[hook]
changegroup = hg update

简单吧?但由于某种原因,这永远不会执行.我也尝试编写一个执行此操作的shell脚本..hg/hgrc看起来像这样:

[hooks]
changegroup = /home/marc/bin/hg-update

和hg-update看起来像这样:

#!/bin/sh
hg help >> /home/marc/works.txt;
hg update >> /home/marc/works.txt;
exit 0;

但同样,这不会更新.hg help写出来的内容works.txt,但没有写出来hg update.有什么明显的东西我在这里不见了吗?这一直困扰着我好几天,我似乎无法让它发挥作用.

更新

好的,再次,使用-v我的工作站命令行上的开关推送到远程仓库,即使我有这些echo行,也不打印任何详细消息.hg/hgrc.但是,当我从同一文件系统上的repo克隆推送(我通过SSH登录)时,这就是我得到的:

bash-3.00$ hg -v push ../test-repo/
pushing to ../test-repo/
searching for changes
1 changesets found
running hook prechangegroup: echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
Remote repo is at 821:1f2656753c98
Remote repo wdir is at 821:1f2656753c98
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
running hook changegroup: echo "Updating.... `hg update -v`"
echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
Updating.... resolving manifests
getting license.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Remote repo is at 822:389a6c7276c6
Remote repo wdir is at 822:389a6c7276c6

所以它可以工作,但只有当我从同一个文件系统推出时才会这样.如果我尝试通过网络从另一个工作站推送回购,它不起作用.



1> smf68..:

好吧,在经历了与Marc W前一段时间相同的挫折之后,我终于找到了问题的解决方案,至少在使用hgwebdir WSGI脚本完成远程服务时.

我发现当通过HTTP或HTTPS使用这种远程推送时,Mercurial会忽略您写入.hg/hgrc文件或存储库的所有内容.但是,在hgwebdir配置中输入钩子就可以了.

所以如果hgwebdir.wsgi脚本中的底线是这样的话

application = hgwebdir('hgweb.config')

[hooks]配置部分需要进入上面提到的hgweb.config.

一个缺点是这些挂钩是为该配置的[paths]部分中列出的每个存储库执行的.尽管HG提供了另一个支持WSGI的函数(hgweb而不是hgwebdir)来只为一个存储库提供服务,但是它似乎不支持任何挂钩(它也没有任何配置).但是,这可以通过使用如上所述的hgwebdir并使一些Apache RewriteRule将所有内容映射到所需的子目录来规避.这个对我有用:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/reponame
RewriteRule ^(.*)$ reponame/$2 [QSA]

通过HTTP使用远程挂钩获得乐趣:D



2> Barry..:

我花了一些时间自己研究这个.我认为问题的答案在这里简明扼要地描述:

输出必须重定向到stderr(或/ dev/null),因为stdout用于数据流.

基本上,你没有重定向到stderr,因此污染stdout.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有