这应该是一个非常简单的运行,但由于某种原因它不适用于我的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,它就不起作用。
答案 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)
首先,我想纠正上面的一些评论。
[hooks]
outgoing = hg update -R $HG_URL
现在针对你的问题....我建议创建prechangegroup和changegroup钩子并打印一些调试输出。
[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 serve
由root
运行,而回购下的大多数文件都属于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