質問

私は、いくつかのサブレポジトリーを備えた水銀リポジトリにコードがあるチームで作業しています。

main/
main/subrepo1/
main/subrepo1/subrepo2/

Mercurialのデフォルトの動作は、aの場合です hg commit 「メイン」で実行され、サブレポジトリー「subrepo1」と「subrepo2」の顕著な変更もコミットされます。同様に、「メイン」がプッシュされると、「subrepo1」と「subrepo2」での発信コミットもプッシュされます。

私たちは、人々がしばしば不注意に彼らのサブレポジトリーの変化をコミットし、プッシュすることを発見しました(彼らは彼らが変更を加えたことを忘れていたので、そして hg status デフォルトでは、再帰的な変更を表示しません)。また、このような世界的なコミット /プッシュは、ほとんどの場合、チームでは偶然であることがわかります。

Mercurial 1.7は最近、状況を改善しました hg status -Shg outgoing -S, 、サブレポジトリーの変化を示しています。それでも、これには人々が注意を払う必要があります。

マーキュリアルに作る方法はありますか hg commithg push それ以外の場合はコミット/プッシュされるサブレポストリに変更/コミットがある場合は中止しますか?

役に立ちましたか?

解決 2

Mercurial 2.0は、手動で指定しない限り、サブレポジトリーをコミットすることを自動的に防ぎます --subrepos (または、あるいは、 -S)への議論 commit.

たとえば、サブレポジトリに保留中の変更がある間にコミットを実行しようとします。次のメッセージが表示されます。

# hg commit -m 'change main repo'
abort: uncommitted changes in subrepo hello
(use --subrepos for recursive commit)

ただし、追加することでコミットを正常に実行できます --subrepos コマンドへ:

# hg commit --subrepos -m 'commit subrepos'
committing subrepository hello

まだ注意すべきいくつかのこと:あなたが変更した場合 リビジョン サブレポジトリは現在ありますが、そうではありません コンテンツ Subrepositoryのうち、Mercurialは喜んでバージョンの変更をコミットします --subrepos 国旗。さらに、再帰的なプッシュは、警告なしにまだ実行されます。

他のヒント

Mercurial 1.8以来、構成設定があります 再帰コミットを無効にします. 。親リポジトリで .hg/hgrc あなたは付け加えられます:

[ui]
commitsubrepos = no

親リポジトリでのコミットがサブレポジトリのコミットされていない変更を見つけた場合、サブレポジトリーを静かにコミットするのではなく、コミット全体が中止されます。

1つの概念は、あなたがあなたに読み取り専用アクセスを持っているURLを使用することです .hgsub ファイル。それからあなたが実際にサブレポを押し込みたいとき、あなたはそれにCDだけをすることができて、 hg push THE_READ_WRITE_URL.

VONCの「コミット前」のアイデアを使用した1つの可能なソリューション。

2つのスクリプトをセットアップします。最初 check_subrepo_commit.sh:

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg status -a -m`
GLOBAL_CHANGES=`hg status -S -a -m`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Subrepository changes exist!"
    exit 1
fi
exit 0

二番目、 check_subrepo_push.sh:

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg outgoing | grep '^changeset:'`
GLOBAL_CHANGES=`hg outgoing -S | grep '^changeset:'`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Global changes exist!"
    exit 1
fi
exit 0

以下を追加してください .hgrc:

[hooks]
pre-commit.subrepo = check_subrepo_commit.sh
pre-push.subrepo = check_subrepo_push.sh

デフォルトでは、 hg pushhg commit サブレポジトリーに未解決の変更がある場合、中止します。 SOのようなコマンドを実行する:

SUBREPO=1 hg commit

小切手をオーバーライドし、本当に必要な場合にグローバルなコミット/プッシュを実行できるようにします。

a pre-commit 針 (いいえ precommit)できる hg status -S あなたのために、そしてそれが変更を検出した場合のコミットをブロックしますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top