2013-06-05 11 views
6

背景分割後のMercurialにファイル接続を破る:不良ファイルが

は、最初にファイルbase.cがあった、そのファイルは1つのブランチのみBaseを持っていたリポジトリにあったが。

Baseを分枝してExtendedブランチとした。その後、この新しいブランチにはbase.cにいくつかの変更が加えられました。

base.cBaseにバグが修正された場合は、Extendedにマージされます。

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

問題:彼らは共通の歴史を共有しているためファイルが分割された

、Mercurialは、ext.cbase.cのコピーであることを知らされました。残念ながら、これは良い考えではありませんでした。

は今バグが Base枝の上に固定され、 Extendedにマージされている場合、Mercurialは後者がもはや元に任意の類似性を持っているにもかかわらず、それらの変更は base.cext.cの両方に適用されるべきであると考えています。これは非常に迷惑なマージになります。

ext.cbase.cと同じではないとMercurialに伝える方法はありますか? 1つの解決策は、ext.cを新しいファイルに置き換えることですが、その後の履歴は従いません。

+0

興味深い問題です。あなたは 'hg copy'でコピーを作ったと思いますか? – icabod

+0

はい 'hg copy'が使用されました。 – user694733

+4

'もしhgがext.c'を忘れてしまったら、それを新しいファイルとして' hg add 'すると接続が壊れる可能性がありますが、この時点までにすべての履歴を失うでしょう。しかし、 'extの_earlier_バージョンを追加することができます。c '(おそらくリネームの前に)、再生(グラフト)することができます。 – alexis

答えて

2

hg forget ext.cで接続を切断し、次にhg add ext.cを新しいファイルとして破損させることができます。しかし、チップリビジョンext.cでこれを行うと、この時点までのすべての履歴が失われます。

代わりに、ext.cの前のバージョンを追加することができます。名前を変更する前から以前のバージョンを追加してから履歴を再生(移植)します。あなたは過去のリビジョンへの分岐としてext.cの歴史を追加し、先端にそれをマージすることができます:

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

または多分それは問題ではない、とあなただけの現在のtipext.cの歴史を追加することができます。

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

これらのアプローチのどちらが書き換えどんな歴史が関与する(ext.cの「忘れられた」バージョンは単なる行き止まりとして残されている)ので、伝播する変更で問題はありません。

関連する問題