Mercurial钩子没有正确执行

时间:2009-05-11 15:25:32

标签: version-control mercurial mercurial-hook

这应该是一个非常简单的运行,但由于某种原因它不适用于我的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开关推送到远程仓库,即使我在{{1}中有echo行,也不打印任何详细消息}。但是,当我从同一文件系统上的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

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

9 个答案:

答案 0 :(得分:10)

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

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

因此,如果 hgwebdir.wsgi 脚本中的底线类似于

application = hgwebdir('hgweb.config')

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

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

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

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

答案 1 :(得分:10)

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

  

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

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

答案 2 :(得分:3)

首先,我想纠正上面的一些评论。

  • 在推送文件系统时也会调用挂钩。
  • 没有必要将挂钩保持在您希望它们操作的仓库中。您也可以在用户端编写与问题相同的钩子。您必须将事件从changegroup更改为outgoing,并使用-R开关指定远程repo的URL。然后,如果推送用户对远程仓库具有足够的权限,则挂钩将成功执行。

.hg / hgrc

[hooks]
outgoing = hg update -R $HG_URL

现在针对你的问题....我建议创建prechangegroup和changegroup钩子并打印一些调试输出。

.hg / hgrc

[hooks]
prechangegroup = echo "Remote repo is at `hg tip -q`"
                 echo "Remote repo wdir is at `hg parents -q`"
changegroup    = echo "Updating.... `hg update -v`"
                 echo "Remote repo is at `hg tip -q`"
                 echo "Remote repo wdir is at `hg parents -q`"

并且还使用-v开关进行推送,以便您可以知道正在运行哪个挂钩。如果你仍然想不通,请发布输出。我也许可以提供帮助。

答案 3 :(得分:3)

我的问题是我的hgwebdir应用程序作为“hg”用户运行,但是存储库归我所有,所以我不得不将这个配置添加到hgweb.config以使其运行挂钩:

[trusted]
users = me

答案 4 :(得分:2)

您需要在远程存储库的hgrc中使用它。听起来好像是在你当地的回购中。

编辑:这还取决于你的推动方式。某些方法不会在右侧调用挂钩。 (ssh确实,我认为HTTP确实如此,文件系统

Edit2:如果你在远程repo的电脑上“本地”推送怎么办?您可能在Web服务器和hgrc文件之间具有不同的用户/权限。 (参见[server]和hgrc的可信指令。)

答案 5 :(得分:2)

我遇到了从Windows Eclipse通过http推送的相同问题,但在捕获stderr之后,我发现hg.bat文件需要完整路径。我的钩子部分现在看起来像:

[hooks]
incoming = c:\Python27\Scripts\hg.bat update > hg_log.txt 2>>hg_err.txt

希望这有助于其他人。   SteveT

答案 6 :(得分:1)

试试turning on hook debugging,看看它为什么没有运行。

可能是权限问题或类似问题。

答案 7 :(得分:1)

需要一段时间,但我得到了它。

我从

开始
[hooks]
tag=set >&2
commit=set >&2

>& 2将其传递给标准错误,以便远程控制台显示它。

当远程时,如果它正在运行,它应该在控制台中输出

hg push https://host/hg   -v

不是。

我正在使用hgweb.cgi,所以我切换到hgweb.wsgi没有任何区别。

我发现有些钩子不会被远程调用。

当我把它切换到

[hooks]
incoming= set >&2

钩子标记和提交似乎没有被调用,但传入和变更集会被调用。我还没有确认其他人。

现在我开始工作了,我换回了hgweb.cgi,一切都运转不了。

答案 8 :(得分:1)

我找到的原因与将stdout重定向到stderr无关。正如您在维基页面中看到的那样,未在维基的当前版本中指定 https://www.mercurial-scm.org/wiki/FAQ#FAQ.2FCommonProblems.Any_way_to_.27hg_push.27_and_have_an_automatic_.27hg_update.27_on_the_remote_server.3F

我发现的问题是权限

在我的原始设置中,我有一个用户,让我们说hguser在其主页上有一个回购,并使用脚本/etc/init.d/hg.init来启动hg serve。问题hg serveroot运行,而回购下的大多数文件都属于hguser(其中一些文件在某些​​时候切换到root,但它赢了&# 39;记住,因为我会用chown

来纠正它们

解决方案:

  • chown -R hguser:hguser /home/hguser/repo(纠正所有文件,回到hguser)
  • 启动su hguser -c "hg serve ..."(在我的情况下来自/etc/init.d/hg.init
  • changegroup = hg update -C [hooks] repo/.hg/hgrc照常

现在它应该适用于push

PS:在我的情况下,我宁愿更新到特定分支的头部,所以我使用hg update -C -r staging,使登台服务器仅更新到预期分支的头部,即使{{1来自另一个分支(例如tip

BTW我的development脚本最终如下:(注意hg.init部分)

su hguser

PS:归功于http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html