8

これは非常に簡単に実行できるはずですが、何らかの理由で私の Mercurial リポジトリでは機能しません。私が望むのは、hg update誰かがプッシュするたびにリモートリポジトリが自動的に実行されることだけです。だから私は私の .hg/hgrc ファイルにこれを持っています:

[hook]
changegroup = hg update

シンプルですね。しかし、何らかの理由で、これは決して実行されません。これを行うシェルスクリプトも書いてみました。.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/
../test-repo/ へのプッシュ
変更の検索
1 個のチェンジセットが見つかりました
running hook prechangegroup: echo "リモート リポジトリは `hg tip -q` にあります"
echo "リモート リポジトリ wdir は `hg Parents -q` にあります"
リモートリポジトリは 821:1f2656753c98 にあります
リモートリポジトリの wdir は 821:1f2656753c98 にあります
変更セットの追加
マニフェストの追加
ファイル変更の追加
1 つのファイルに 1 つの変更を加えた 1 つの変更セットを追加しました
running hook changegroup: echo "更新中.... `hg update -v`"
echo "リモート リポジトリは `hg tip -q` にあります"
echo "リモート リポジトリ wdir は `hg Parents -q` にあります"
更新しています....マニフェストを解決しています
license.txt の取得
1 個のファイルが更新され、0 個のファイルがマージされ、0 個のファイルが削除され、0 個のファイルが未解決です
リモートリポジトリは 822:389a6c7276c6 にあります
リモートリポジトリの wdir は 822:389a6c7276c6 にあります

したがって、機能しますが、同じファイルシステムからプッシュする場合のみです。ネットワーク経由で別のワークステーションからリポジトリにプッシュしようとしても機能しません。

4

9 に答える 9

11

まあ、Marc W が少し前に行ったのと同じフラストレーションのステップを経験した後、少なくとも hgwebdir WSGI スクリプトを使用してリモート サービスを提供する場合は、問題の解決策を最終的に見つけました。

この種の HTTP または HTTPS 経由のリモート プッシュを使用すると、Mercurial は .hg/hgrc ファイルまたはリポジトリに書き込むすべてを単純に無視することがわかりました。ただし、hgwebdir 構成にフックを入力するとうまくいきます。

したがって、hgwebdir.wsgiスクリプトの最終行が次のような場合

application = hgwebdir('hgweb.config')

[hooks] 構成セクションは、前述のhgweb.configに入る必要があります。

1 つの欠点は、これらのフックがその構成の [paths] セクションにリストされているすべてのリポジトリに対して実行されることです。HG は別の WSGI 対応機能 (hgwebdir の代わりに hgweb) を提供して単一のリポジトリのみを提供しますが、その機能はフックをサポートしていないようです (構成もありません)。ただし、これは、上記のように hgwebdir を使用し、一部の Apache RewriteRule ですべてを目的のサブディレクトリにマップすることで回避できます。これは私のために働きます:

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

HTTP 経由でリモート フックを使って楽しんでください :D

于 2010-02-02T12:37:52.353 に答える
10

私はこれを自分で調査するのに時間を費やしました。問題への答えはここに簡潔に記述されていると思います:

データストリームには stdout が使用されるため、出力は stderr (または /dev/null) にリダイレクトする必要があります。

基本的に、stderr にリダイレクトしていないため、stdout を汚染しています。

于 2010-09-03T10:01:15.647 に答える
3

まず、上記のいくつかのコメントを修正したいと思います。

  • フックは、ファイル システムをプッシュするときにも呼び出されます。
  • 操作したいレポにフックを保持する必要はありません。ユーザー側で質問と同じフックを書くこともできます。イベントをchangegroupからoutgoingに変更し、-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 スイッチを押して、どのフックが実行されているかを知ることができます。それでもわからない場合は、出力を投稿してください。お手伝いできるかもしれません。

于 2009-05-17T00:28:05.763 に答える
2

http 経由で Wi​​ndows Eclipse からプッシュするのと同じ問題がありましたが、stderr をキャプチャした後、hg.bat ファイルへのフル パスが必要であることがわかりました。私のフックセクションは次のようになります。

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

これが他の誰かに役立つことを願っています。スティーブ

于 2010-10-19T20:34:11.917 に答える
2

リモートリポジトリの hgrcにある必要があります。あたかもローカルリポジトリにあるかのように聞こえます。

編集:それはまた、あなたがどのようにプッシュしているかによっても異なります. メソッドによっては、右側のフックを呼び出さないものがあります。(ssh は行う、HTTP は行うと思いますが、ファイル システムは行いませ)

Edit2:リモートレポのコンピューターで「ローカルに」プッシュするとどうなりますか。Web サーバーと hgrc ファイルの間でユーザー/権限が異なる場合があります。([server] および hgrc の信頼できるディレクティブを参照してください。)

于 2009-05-11T20:17:19.317 に答える
1

これについて私が見つけた理由は、へのリダイレクトとは何の関係もありませstdoutstderr。wiki ページでわかるように、wiki の現在のバージョンでは指定されていませ

私が見つけた問題は、権限に関するものです。

私の元のセットアップでは、ユーザーがいて、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

PS: 私の場合は、むしろ特定のブランチのヘッドに更新するので、 を使用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

PS: http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.htmlの功績による

于 2015-05-29T21:06:49.473 に答える
1

フックのデバッグをオンにして、実行されていない理由を確認してください。

おそらくパーミッションの問題かそのようなものです。

于 2009-05-11T15:41:40.140 に答える
1

しばらく時間がかかりましたが、動作しました。

私はから始めました

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

>&2 はそれを標準エラーにパイプして、リモートコンソールに表示します。

リモートの場合、実行中であればコンソールに出力する必要があります

hg push https://host/hg   -v

そうではありませんでした。

hgweb.cgi を使用していたので、hgweb.wsgi に切り替えても違いはありませんでした。

私が発見したのは、一部のフックがリモートで呼び出されないことです。

に切り替えたとき

[hooks]
incoming= set >&2

フック タグとコミットは呼び出されないようですが、incoming と changeset は呼び出されます。他は確認していません。

動作するようになったので、hgweb.cgi に戻しましたが、すべて同じように動作します。

于 2010-11-08T14:18:27.630 に答える