水銀サブレポジトリー:偶発的な再帰コミットとプッシュを防ぐ
-
27-10-2019 - |
質問
私は、いくつかのサブレポジトリーを備えた水銀リポジトリにコードがあるチームで作業しています。
main/
main/subrepo1/
main/subrepo1/subrepo2/
Mercurialのデフォルトの動作は、aの場合です hg commit
「メイン」で実行され、サブレポジトリー「subrepo1」と「subrepo2」の顕著な変更もコミットされます。同様に、「メイン」がプッシュされると、「subrepo1」と「subrepo2」での発信コミットもプッシュされます。
私たちは、人々がしばしば不注意に彼らのサブレポジトリーの変化をコミットし、プッシュすることを発見しました(彼らは彼らが変更を加えたことを忘れていたので、そして hg status
デフォルトでは、再帰的な変更を表示しません)。また、このような世界的なコミット /プッシュは、ほとんどの場合、チームでは偶然であることがわかります。
Mercurial 1.7は最近、状況を改善しました hg status -S
と hg outgoing -S
, 、サブレポジトリーの変化を示しています。それでも、これには人々が注意を払う必要があります。
マーキュリアルに作る方法はありますか hg commit
と hg 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 push
と hg commit
サブレポジトリーに未解決の変更がある場合、中止します。 SOのようなコマンドを実行する:
SUBREPO=1 hg commit
小切手をオーバーライドし、本当に必要な場合にグローバルなコミット/プッシュを実行できるようにします。
a pre-commit
針 (いいえ precommit
)できる hg status -S
あなたのために、そしてそれが変更を検出した場合のコミットをブロックしますか?