8

goプログラミング言語には、mqを使用したコードレビューに関するページがあり、「mqパッチが適用されている間にプル、プッシュ、更新、およびコミットすると、リポジトリが損傷する可能性があるため」と記載されています。

プッシュまたは更新が問題になる可能性がある理由を理解していますが、プルが問題になっていますか?

mqパッチを適用してプルすると、リポジトリが破損しますか?

4

2 に答える 2

6

mq パッチを適用してプルすると、リポジトリが破損しますか?

答えはノーです。プルすると、変更セットがローカル履歴に追加されます。適用された MQ パッチはチェンジセット グラフにもチェンジセットとして存在しますが、これは危険ではなく、データが失われることもありません。

いくつかのパッチを適用した場合に発生する可能性があるのは、次のとおりです。

.... a --- b --- p1 --- p2 --- p3

次に、アップストリームのメーリングリストにパッチを送信して、含めるようにします。誰かがパッチをレビューしてコミットし、変更セットをメイン リポジトリにプッシュします。その後、他の変更セットがプッシュされ、次にプルすると次のようになります。

.... a --- b --- p1 --- p2 --- p3 --- c --- d

への変更セットは、リポジトリ内の MQ パッチのままですが、p1MQ以外の子が含まれるようになりました! それらをポップしようとすると (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 は最終的にこれらの行を自動的に削除する必要があります。

于 2012-03-12T16:07:50.053 に答える
5

リポジトリに 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 ページで提案されているフックは適切な保護手段を提供します。

アップストリームの変更セットの上にいつでもパッチをリベースできることに注意してください。その方法の説明については、このページを参照してください。

于 2011-03-02T01:05:08.410 に答える