9

In Mercurial, the phase of a revision can be changed arbitrarily. What are the consequences of a phase change for all possible transitions (public, draft, secret) x (public, draft, secret)? Which phase changes are safe? Which may cause troubles and which kind of troubles? Which are more or less no-ops?

4

2 に答える 2

10

コミットのデフォルト フェーズは ですdraft。これは、フェーズが存在しない場合の処理​​方法です。変更セットをプッシュするdraftと、mercurial は自動的にフェーズを に変更しpublicます。これを使用して、どの変更セットが既に公開されているかどうかを知ることができます。

しかし、実際の問題は、変更セットがフェーズにある場合、mercurial では履歴編集拡張機能 ( 、など)publicを使用してそれらを変更できないことです。履歴の編集はローカル リポジトリでのみ行われ、 /操作では反映されないため、これは非常に重要です。そのため、変更セットが公開されると制御不能になり、変更するのは危険です。mqrebasepullpush

任意のフェーズから別のフェーズに変更できます。「通常の流れ」は、より高いフェーズ (secret->draft->public) に移行することですが、Mercurial では、--forceオプションを使用してより低いフェーズに変更することができます。相変化だけでは無害です。たとえば、orから移動publicするときに発生する唯一のことは、履歴編集の保護が失われることだけです。他には何もありません。プルとプッシュは引き続き正常に機能します。変更セットには一意の識別子があるため、Mercurial が変更セットについて混乱することはありません。このようなフェーズ変更に行われる履歴編集アクションは、問題を引き起こす可能性があります。そのため、Mercurial はフェーズ変更で警告を出し、それが本当に必要なものであることを確認するためにオプションを要求します。draftsecret--force

一般に、公開されたコミットは変更されるべきではありません。これは、フェーズが確実にしようとしていることです。しかし、すべてのリポジトリを制御できる可能性があります。または、何かを押して、まだ誰もそれを引っ張っていないことを知っているかもしれません。理由が何であれ、変更​​セットのフェーズをドラフトに戻して編集するオプションがあります。ただし、この編集は変更セットがあるすべてのリポジトリで行う必要があります。

于 2012-10-25T21:54:14.877 に答える