6

バックグラウンド:

最初はファイルbase.cがあり、そのファイルはブランチが 1 つしかないリポジトリにありましたBase

Base-branchを作るために分岐されましたExtended。次に、この新しいブランチにいくつかの変更が加えられましたbase.c

のファイルbase.cでバグが修正された場合Base、それらは にマージされExtendedます。

base.cブランチにあまりにも多くのものを追加するExtendedのは良い考えではないことが判明したため、ファイルはにコピーされext.cます。次に、ほとんどのExtended追加機能が から削除されbase.cBase機能が から削除されext.cます。したがって、この時点base.cExtendedは と非常によく似ていBaseます。

問題:

ファイルが分割されたとき、共通の履歴を共有していたため、Mercurialext.cは のコピーであると通知されました。base.c残念ながら、これは良い考えではありませんでした。

バグがBaseブランチで修正され、 にマージされた場合Extended、Mercurial はそれらの変更を と の両方に適用する必要があると考えていbase.cますext.c。これにより、マージが非常に煩わしくなります。

ext.cと同じと見なされなくなったことを Mercurial に伝える方法はありbase.cますか? 解決策の 1 つは新しいファイルに置き換えることext.cですが、そうすると履歴が追跡されません。

4

1 に答える 1

2

との接続を解除してhg forget ext.cからhg add ext.c、新しいファイルとして作成できます。しかし、これを のティップ リビジョンで行うと、ext.cこれまでのすべての履歴が失われます。

代わりにできることはext.c、名前を変更する前から、以前のバージョンの を追加し、それ以降の履歴を再生 (移植) することです。の履歴をブランチとして過去のリビジョンに追加し、ext.cそれをヒントにマージできます。

---o---o---o---(tip)--(merge)
    \                /
     e---e---e ...  e

ext.cまたは、おそらくそれは問題ではなく、現在の に履歴を追加するだけですtip:

---o---o---o---(tip)--e--e--e--e

これらのアプローチはどちらも履歴の書き換えを必要としないため (「忘れられた」バージョンのext.cは単に行き止まりのままです)、変更の伝播に問題はないはずです。

于 2014-05-14T10:42:16.140 に答える