这应该是一个非常简单的运行,但由于某种原因它不适用于我的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
所以它可以工作,但只有当我从同一个文件系统推出时才会这样.如果我尝试通过网络从另一个工作站推送回购,它不起作用.
好吧,在经历了与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
我花了一些时间自己研究这个.我认为问题的答案在这里简明扼要地描述:
输出必须重定向到stderr(或/ dev/null),因为stdout用于数据流.
基本上,你没有重定向到stderr,因此污染stdout.