0

Mercurialのフォローアップとして: "hg commit" の前に "hg pull -u" を強制 する フックの使用を開始しました

[hooks]
pretxnchangegroup.forbid_2heads = /usr/local/bin/forbid_2head.sh

forbid_2head.sh は次のようになります

#!/bin/bash 
BRANCH=`hg branch`
COUNT=`hg heads --template '{branch}|{rev}\n' | grep ^${BRANCH} | wc -l` 
if [ "$COUNT" -ne "1" ] ; then 
   echo "=========================================================="
   echo "Trying to push more than one head, which is not allowed"
   echo "You seem to try to add changes to an old changeset!"
   echo "==========================================================" 
   exit 1 
fi 
exit 0

これは、複数の名前付きブランチを許可するhttp://tutorials.davidherron.com/2008/10/forbidding-multiple-heads-in-shared.htmlにあるスクリプトの派生物です。

私が今抱えている問題は、

  • それは私が望んでいたhg push -fを停止します
  • また、着信チェンジセットがあり、発信コミットがある場合に備えて、hg pull を停止します。これはさすがにまずい

同じスクリプトを何らかの方法で再利用して、フックの設定を変更し、"hg push -f" を停止することはできますか? または、forbid_2head.sh で、これが実行中のプッシュ コマンドかプル コマンドかを知ることができますか?

4

1 に答える 1

1

まず、このスクリプトは完全には正しくありません。サーバー上で現在チェックアウトされているブランチ (1 つのhg branch) レポートのヘッド数をカウントしているだけです。を使用することで改善できます

hg heads tip

のブランチのヘッドを取得しtipます。しかし、誰かが一度に複数のブランチにチェンジセットをプッシュするかもしれないので、本当に欲しいのは

hg heads --template '{branch}\n' $HG_NODE:tip

$HG_NODE:tip(まだコミットされていないトランザクションでプッシュされた変更セット)によって接続されたブランチのブランチ ヘッドを検索します。次に、それを比較できます

hg log --template '{branch}\n' -r $HG_NODE:tip | sort -u

これは、チェンジグループが触れたブランチです。

既存の複数のヘッドを許可したくない場合は、上記を単純化して

$(hg heads --template 'x' | wc -c) -eq $(hg branches | wc -l)

これは、ブランチ ヘッドの数がブランチの数と等しいこと、つまり、名前付きブランチごとに正確に 1 つのブランチ ヘッドがあることをテストするだけです。

それはさておき、言及させてください$HG_SOURCE。その環境変数は、フックを実行するときに Mercurial によって設定されpushます。ファイルシステムへの直接アクセスを使用してチェンジグループがリポジトリにプッシュされている場合は値が設定されserve、チェンジグループが SSH または HTTP 経由で受信されている場合は値が設定されます。Mercurial の本を参照してください。

結論として、これは優れた「複数ヘッドを禁止する」スクリプトだと思います。

#!/bin/sh
HEADS=$(hg heads --template 'x' | wc -c)
BRANCHES=$(hg branches | wc -l)
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES
于 2012-11-01T08:20:33.283 に答える