goプログラミング言語には、mqを使用したコードレビューに関するページがあり、「mqパッチが適用されている間にプル、プッシュ、更新、およびコミットすると、リポジトリが損傷する可能性があるため」と記載されています。
プッシュまたは更新が問題になる可能性がある理由を理解していますが、プルが問題になっていますか?
mqパッチを適用してプルすると、リポジトリが破損しますか?
goプログラミング言語には、mqを使用したコードレビューに関するページがあり、「mqパッチが適用されている間にプル、プッシュ、更新、およびコミットすると、リポジトリが損傷する可能性があるため」と記載されています。
プッシュまたは更新が問題になる可能性がある理由を理解していますが、プルが問題になっていますか?
mqパッチを適用してプルすると、リポジトリが破損しますか?
mq パッチを適用してプルすると、リポジトリが破損しますか?
答えはノーです。プルすると、変更セットがローカル履歴に追加されます。適用された MQ パッチはチェンジセット グラフにもチェンジセットとして存在しますが、これは危険ではなく、データが失われることもありません。
いくつかのパッチを適用した場合に発生する可能性があるのは、次のとおりです。
.... a --- b --- p1 --- p2 --- p3
次に、アップストリームのメーリングリストにパッチを送信して、含めるようにします。誰かがパッチをレビューしてコミットし、変更セットをメイン リポジトリにプッシュします。その後、他の変更セットがプッシュされ、次にプルすると次のようになります。
.... a --- b --- p1 --- p2 --- p3 --- c --- d
への変更セットは、リポジトリ内の MQ パッチのままですが、p1
MQ以外の子が含まれるようになりました! それらをポップしようとすると (Mercurial 2.1.1 の場合):p3
$ hg qpop
abort: popping would remove a revision not managed by this patch queue
これはちょっとしたデッドロックです。面倒ですが、危険ではありません。これを解決するには、MQ によって管理されなくなったことp1
をMQ に理解させる必要があります。p3
これを行うには、これらの変更セットの行を から削除し.hg/patches/status
ます。これが発生した場合、MQ は最終的にこれらの行を自動的に削除する必要があります。
リポジトリに MQ パッチを適用しているときに、誤って上流の変更セットとマージすると、確かに問題になる可能性があります。問題が発生しているように見える、私が試したシナリオを次に示します。
hg qpush -a
hg pull
(ただし、しないでくださいhg update
)。これにより、新しいブランチが作成されます(hg heads
現在のブランチqtip
と、プルしたばかりの新しいブランチが表示されますtip
)hg update -C tip
せずに実行しました。hg merge
。おっとっと!これまでにない MQ パッチをマージしましたqfinished
。MQ は履歴を作成および破棄することで機能するため、パッチ変更セットは履歴の通常の部分のように見えます。ただし、適用されたパッチを「飛び越え」てパッチ以外の変更セットとマージしたため、パッチをポップオフすることはできなくなりました。実際、実行hg qpop
は次のようなメッセージで中止されます。
abort: popping would remove a revision not managed by this patch queue
私は通常、パッチ キューを操作するときは、プルまたはプッシュに注意して意識するようにしていますが、go ページで提案されているフックは適切な保護手段を提供します。
アップストリームの変更セットの上にいつでもパッチをリベースできることに注意してください。その方法の説明については、このページを参照してください。