2012-03-02 12 views
5

私は2つの常設ブランチ、デフォルトとUATを持つ水銀のリポジトリを持っています。新しいバージョンのアプリケーションをUAT環境に展開(プロモート)するたびに、安定したデフォルトコミットをUATブランチにマージすることでこれを行います。場合によってはUATブランチでバグ修正され、これらのバグ修正がデフォルトに戻されます。Mercurial:ブランチ固有の変更がダミーマージ後に戻ってくる

UATブランチでは、接続文字列とさまざまな環境設定のためにいくつかのものを展開する必要があります。私がしようとしたのは、UATブランチでこれらの変更を行い、UATにデフォルトをマージした直後にコミットすることでした。この1つのコミットをデフォルトに戻してダミーマージしました。これは、UATからデフォルトへのバグフィックスマージは、これらのUAT固有の変更をやり直すことはしません。

しかし、私が望んでいたほどスムーズに行かなかった。ダミー合併デフォルトにコミットしてから、私は次のシナリオの両方を試してみた:#1、#2を実行している間に

1) Make a few more commits to default and then "promote" to UAT (merge default onto UAT) 
2) Make a bugfix on UAT and "backport" it to default (merge UAT onto default) 

両方のシナリオが同じ地点から開始するように、私はすべてを剥奪しました。

私は何を見ていることは、最後の方向に応じて、私はまだ、どちらか一方のマージを行った後に変更されたファイルを検査し、元に戻す必要があるマージということである - 時々マージがUATにデフォルト設定を入れしようと時々UAT構成をマージします。

構成の変更を元に戻してマージをコミットすると、同じ方向の将来のマージが正しく動作しますが、もう一度別の方向に進むと、誤った構成がファイルに再度挿入されます。

私には何が欠けていますか?

答えて

5

私はこの問題がthis questionの問題と似ていると信じています。マージは動作しないと思うように動作しません。マージは、ファイル状態を比較することの唯一の質問です。ではなく、というブランチから別のブランチに変更を適用することです。 xyはUATのためのコンフィグ設定を含み、bが無いコンフィグ設定でダミーマージされ

UAT:  ... x --- y --- z 
          \ 
default: ..... a --- b --- c 

あなたの出発点は、このような歴史です。したがってbのファイルはaのように見えます。それらはダミーマージされています。

あなたは今、あなたがUATを促進したいdefaultに新しい変更を加えた場合、あなたがうまくいくには:

UAT:  ... x --- y 
        \ 
default: ..... a --- b --- c 

マージがycの間にあります。これは共通の祖先がyである縮退したマージです。つまり、bcの間のすべての変更は、3方向マージで「勝ち」ます。兄貴が3ウェイマージにマージされるかについての表は、次のとおりです。

ancestor local other -> merge 
old  old old  old (nobody changed the hunk) 
old  old new  new (they changed the hunk) 
old  new old  new (you changed the hunk) 
old  new new  new (hunk was cherry picked onto both branches) 
old  foo bar  <!> (conflict, both changed hunk but differently) 

マージ結果、マージの「方向」に依存しないことに注意:テーブルはlocalとに関して対称でありますother列。ここで、ancestorlocalはともにyであり、othercである。だから、テーブルは次のようになります。

ancestor local other -> merge 
old  old new  new (they changed the hunk) 

あなたは、マージ結果は常にcで行われたnew変更が含まれていることを見ることができます。

マージが縮退していることは重要ではありません。あなたがUATに関する新しいコミットを持っていて、このコミットが設定文字列に触れていないと仮定すると、あなたはマージ時にどちらの方向にもマージが対称的です。

この問題に対する通常の解決策は、設定文字列を外部化することです。それらをバージョンコントロールの外側に置く - 環境変数、バージョン管理されていない設定ファイルなど。可能であれば、バージョンコントロールの下にテンプレートとして設定ファイルを置きます。次に、バージョン管理された設定ファイルを含むUATブランチのバージョン管理されていない設定ファイルを作成します。このバージョン管理されていない設定ファイルでは、必要に応じて設定を上書きします。

+0

短期的には、メンテナが自分のマシンから手動でアプリケーションを配備することに制限されています。彼は古いWebアプリケーションなのでクローンが1つしかなく、IISフォルダの設定を変更することは使命です。私が本当に必要とするのは、デフォルトからのマージ、再構築、デプロイ、バグフィックスを後のリリースのデフォルトに戻すことができるワークフローを使用できるようにすることです。私がUATをデフォルトに戻すのではなく、代わりにバグ修正を移植すると、正しく動作すると思いますか?これは、バグ修正がたくさんある場合には問題になります... –

+0

UATの設定をコミットして(あなたのメンテナが簡単に)、ローカルに変更することはできますか?マージの前に変更を残し、コミット時にそれらを除外するために '-X'を使用する必要があります([エクステンションを除外](https://bitbucket.org/aragost/exclude)が少し助けてくれるかもしれません)。 –

+0

これは基本的に彼が現時点でやっていることです。必要に応じて棚上げし、棚上げしません。残念なことに、シームレスではなく、より生産性の高い環境を追加すると、理想的ではない複数の棚やmqを扱わなければなりません。私は今、移植のアプローチを試して、それがどうなるかを見てみようと思っています。 –

関連する問題