31

A、B、Cの3つのリポジトリがあり、すべて同じプロジェクトに関連しています。Aはプロジェクトの最も古いバージョンであり、Bは実際にはどこにも行かなかった実験であり、Cは最新の作業バージョンです。これらのリポジトリはすべて異なるファイルを持っています-それらは同じ製品の異なる実装です。

これらの3つのリポジトリを1つに統合して、履歴を保持したいと思います。これは非常に重要です。BをAの上に、CをBの上にスタックしたいと思いますが、プロジェクトをチェックアウトするときに、リポジトリCに関連する変更のみを取得したいと思います。

私の考えは、Aに名前付きブランチをタグ付けまたは作成し、hg rm *、コミットしてからBを上に重ねることです。Bでも同じことを繰り返して、Cを積み上げて、通常どおりプロジェクトを続行できるようにします。

どう思いますか?また、私がやりたいことのいくつかのインスピレーション1、2

4

1 に答える 1

37

チェンジセットを1つの大きなリポジトリにプルするだけです。Aレポから始めます。

$ hg init combined
$ cd combined
$ hg pull ../A
$ hg update

次に、Bを強制的に引き込み、2つのヘッドをダミーマージして、ファイルをBから保持します。

$ hg pull ../B --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge A and B, kept B"

次に、Cについて繰り返します。

$ hg pull ../C --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge B and C, kept C"

これにより、3行の履歴と、最初にA、次にB、最後にCで終わるマージポイントが得られます。

または、スプライスマップでconvert拡張機能を使用して、3つの履歴をスプライスすることもできます。まず、すべてのチェンジセットを1つのリポジトリに強制的にプルします。次に、Aの先端をBのルートの最初の親として追加するMercurialからMercurialへの変換を実行します。BとCについても同様です。これにより、AからMercurialに移行するときに非常に急激な変化が発生する1つの長い履歴が得られます。 BおよびBからCへ。

私は最初のオプションを選択します。これは最も明確で、履歴を偽造(変換)せずに何が起こるかを最もよく示しています。

于 2012-05-04T14:14:04.810 に答える