运行这应该是一件非常简单的事情,但由于某种原因,它不适用于我的 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. 。但是,当我从同一文件系统上的存储库克隆进行推送时(我通过 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

所以它有效,但只有当我从同一个文件系统推送时才有效。如果我尝试通过网络从另一个工作站推送到存储库,它不起作用。

有帮助吗?

解决方案

我自己花了一些时间研究这个。我认为问题的答案描述得很简洁 这里:

由于STDOUT用于数据流,因此必须将输出重定向到stderr(或 /dev /null)。

基本上,您不会重定向到 stderr,从而污染 stdout。

其他提示

好了,通过感到失望,因为马克·w ^做了相同的步骤去前一阵子之后,我终于找到了解决问题的办法,至少在远程服务与hgwebdir WSGI脚本完成的。

我发现,通过使用HTTP或HTTPS这种远程推送的时候,水银会忽略你写到.hg / hgrc文件或存储库的一切。但是,在进入钩的在hgwebdir配置是卓有成效的。

所以,如果在底线您的 hgwebdir.wsgi 的脚本是像

application = hgwebdir('hgweb.config')

[钩]配置节需要进入所提到的 hgweb.config

一个缺点是,这些钩子是对于每库执行在该配置中的[路径]节中列出。尽管HG提供了另一种WSGI能力的功能(hgweb而不是hgwebdir)只服务于一个单一的存储库中,一个似乎不支持任何挂钩(它也没有任何配置)。 这可以,但是,可以通过使用hgwebdir如上所述,并且具有一些Apache的重写规则映射一切成所需的子目录规避。这一次对我的作品:

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

有使用遥控钩通过HTTP乐趣:d

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

  • 当推送文件系统时也会调用挂钩。
  • 没有必要将钩子保留在您希望它们操作的存储库中。您还可以在用户端编写与问题中相同的钩子。您必须将事件从更改组更改为传出,并使用 -R 开关指定远程存储库的 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 开关进行推送,以便您可以知道哪个钩子正在运行。如果您仍然无法弄清楚,请发布输出。我也许能帮忙。

我的问题是,我hgwebdir应用程序运行的“HG”的用户,但该仓库被我拥有的,所以我不得不在此位配置的增加hgweb.config让它运行挂钩:

[trusted]
users = me

您需要把它在远程 repositiory的hgrc。听起来好像它在你的本地回购。

编辑:这也取决于你如何推搡。一些方法不会在右侧调用挂钩。 (SSH并,我想HTTP那样,文件系统不的)

EDIT2:如果您在远程回购的电脑推“本地”。你可能有网络服务器和hgrc文件之间的不同用户/权限。 (参见[服务器]和用于hgrc可信指令。)

我有同样的问题通过HTTP从Windows Eclipse的推动,但捕捉标准错误之后,我发现的完整路径,需要到hg.bat文件。我的钩部现在看起来像:

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

希望这可以帮助其他人。   SteveT

花了一段时间,但我得到了它的工作。

我开始与

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

>&二管道标准错误,以便远程控制台将显示它。

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

hg push https://host/hg   -v

这不是

我用hgweb.cgi所以我切换无差hgweb.wsgi。

我发现的是,一些钩子则不会调用远程。

当我它切换到

[hooks]
incoming= set >&2

挂钩标签,并承诺不会似乎被调用,但传入和变更都被调用。我还没有证实了别人。

现在,我得到它的工作我切换回hgweb.cgi,一切工作一样。

我发现这个原因与重定向无关 stdoutstderr. 。正如您在 wiki 页面中看到的那样,它在 wiki 的当前版本中并未指定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 在某些时候,但它不会介意,因为我会纠正它们 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

附:就我而言,我宁愿更新到特定分支的头部,所以我使用 hg update -C -r staging, ,使登台服务器仅更新到预期分支的头部,即使 tip 来自另一个分支(例如 development 例如)

顺便说一句我的 hg.init 脚本最终是这样的:(注意 su hguser 部分)

#!/bin/sh
#
# Startup script for mercurial server.
#
# @see http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

HG=/usr/bin/hg
CONF=/etc/mercurial/hgweb.config
# Path to PID file of running mercurial process.
PID_FILE=/etc/mercurial/hg.pid

state=$1

case "$state" in
'start')
    echo "Mecurial Server service starting."
    (su hguser -c "${HG} serve -d --webdir-conf ${CONF} -p 8000 --pid-file ${PID_FILE}")
  ;;

'stop')
  if [ -f "${PID_FILE}" ]; then
    PID=`cat "${PID_FILE}"`
    if [ "${PID}" -gt 1 ]; then
      kill -TERM ${PID}
      echo "Stopping the Mercurial service PID=${PID}."
    else
      echo Bad PID for Mercurial -- \"${PID}\"
    fi
  else

    echo No PID file recorded for mercurial
  fi
  ;;

*)
  echo "$0 {start|stop}"
  exit 1
  ;;
esac

附:由于信用 http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top