私はMercurialを使用してワークフローを複製しようとしています。これは一般的であるはずですが、私は魔法のビットをどうやって行うのかについてはあまりよく分かりません。Mercurial自動電球ワークフロー?
- ユーザーAは、変更セットA1とA2を作成します。ユーザーAにはチェンジセットBまたはCがありません。
- A1とA2がサーバーに送信され、キューに入れられます。他のユーザーBおよびCからの変更セットはキュー内に先にあります。
- 各チェンジセット(B、C、A1/A2)は自動的にメインブランチにリベースされ、ビルドされ、トランクに受け入れられます(または拒否されます)。
- コードベースが非常に大きいので、ビルドに時間がかかります。その間、A3とA4はユーザーAによって生成されます。
- ユーザーAはプルを行い、重複を取得せずにB '、C'および新しいA1 '/ A2を取得します。展開が進むにつれて、A3とA4はトランクの先端に移動します。
ステップ5は、私が最も悩まされているものです。 "git pull --rebase"はチェンジセットが同じであることを認識しているようで、A1/A2は消えますが、Hgでは衝突します。私はHgがまったく同じワークフローであるとは思っていません。開発者がトランクを引っ張り、自分のツリーの手動修正をしなくても、チェンジセットを順番に取得できるようにする必要があります。チェンジセットが拒否された場合の復旧方法についても説明できるワークフローが必要です。戦術を推薦できるこのタイプのワークフローを経験した人はいますか?
ありがとうございました
編集:ここにワークフローのシミュレータがあります。私はチェンジセットが受け入れとスムーズに戻って進行している間に構築を続けることができるという問題を解決する他のワークフローを試みたいと確信しています。
rm -rf master
rm -rf build
rm -rf c1
rm -rf c2
rm -rf c3
rm -rf bundles
# Master repository
mkdir master
hg init master
echo x >> master/m1.txt
hg -R master add master/m1.txt
hg -R master commit master/m1.txt -m"m-1"
echo x >> master/m1.txt
hg -R master commit master/m1.txt -m"m-2"
echo x >> master/m1.txt
hg -R master commit master/m1.txt -m"m-3"
# Build repository
hg clone master build
# Setup first client
hg clone master c1
echo x >> c1/client1.txt
hg -R c1 add c1/client1.txt
hg -R c1 commit c1/client1.txt -m"c1-1"
echo x >> c1/client1.txt
hg -R c1 commit c1/client1.txt -m"c1-2"
# Setup second client
hg clone master c2
echo x >> c2/client2.txt
hg -R c2 add c2/client2.txt
hg -R c2 commit c2/client2.txt -m"c2-1"
echo x >> c2/client2.txt
hg -R c2 commit c2/client2.txt -m"c2-2"
# Setup third client
hg clone master c3
echo x >> c3/client3.txt
hg -R c3 add c3/client3.txt
hg -R c3 commit c3/client3.txt -m"c3-1"
echo x >> c3/client3.txt
hg -R c3 commit c3/client3.txt -m"c3-2"
# Create the 3 bundles simulating the queue; all clients have pushed
# Hopefully this is done with a push hook
# All changesets are still draft phase
mkdir bundles
hg -R c2 bundle bundles/c2.bundle
hg -R c3 bundle bundles/c3.bundle
hg -R c1 bundle bundles/c1.bundle
# Process first bundle
hg -R build pull bundles/c2.bundle --rebase
hg -R build update
hg -R build push master
# Client 1 pulls at this point
hg -R c1 pull master -u --rebase
# Process second and third bundle
hg -R build pull bundles/c3.bundle
hg -R build rebase -b 5 -d 4
hg -R build pull bundles/c1.bundle
hg -R build rebase -b 7 -d 6
hg -R build push master
# Client 1 pulls again, getting the changesets that were pushed
hg -R c1 pull master -u --rebase
ありがとうございました。私はドキュメントを読み直してみました。ドラフト段階では、サーバーがリベースをしようとすると作業が楽になりますが、それは問題がある部分ではありません。私は、サーバーに変更を送信し、適用または却下させ、すべての開発者からの変更を含むリポジトリを自動化して戻すことができるようにしたいと考えています。チェンジセットをリポジトリに残さずに適用すると、チェンジセットを開発者に広める方法を理解できません。段階のチェンジセットも再分散しないので、開発者は複数の重複チェンジセットを持っています。 – Chuckkir
その認識はやや間違っています(やや正しい)。これは、進化の拡張があなたのために行うことです:リベース操作のための適切な陳腐化マーカーの作成。そして、それらのマーカー*は引っ張られるので、誰も "残骸"を残さないでしょう。 – planetmaker
ありがとうございます。私はマーカーがどのように機能するかを見ます。プロセスは、間に引っ張りがない限り動作します。 Aは押すが、B、C、Dは待ち行列に入る。 Aが動作してからBとCを取得します。それが起こると、それがリベースかマージかにかかわらず、いろいろな形で状況が悪くなります。リベースすれば、陳腐化マーカーは削除されず、矛盾します。あなたはそれを先端に置く進化しなければならないマージリビジョンを持っています。 – Chuckkir