6

状況は次のとおりです。開発者Fooは、svnリポジトリからhgリポジトリを作成しました。Fooのhgリポジトリは、svnのトランクの浅いクローンにすぎませんでした(svnブランチ、タグなどはなく、履歴は不完全でした[約100のチェンジセット])。Developer Barも同じことをしましたが、履歴、ブランチ、タグなど全体を含むsvnリポジトリ全体のクローンを作成しました。FooとBarはどちらも、リポジトリでブランチ開発を行っています。

両方のリポジトリに共通のSVN祖先がありますが、各hgリポジトリには異なるバージョン番号があります。Fooの変更を共通の祖先からBarのリポジトリに戻したいと思います。これが私が探しているものの図です:

Fooのレポ:

C'-D'-E-F---G
       \   /
        H-I

バーのレポ:

...A-B-C-D-J-K---L
            \   /
             M-N

C、C'とD、D'の内容は同じですが、バージョン番号とコメントが異なります。

目標:

...A-B-C-D--E-F---G
          \  \   /
           \  H-I
            \
             J-K---L
              \   /
               M-N

これを実現する方法についてのアイデアが不足しています。--splicemap splice.map [SPlice.mapファイルにEDが含まれています]を変換してみました(何もしませんでした)。Clone -fは、すべてを1つのリポジトリにまとめることができましたが、それらは独立したツリーのようです。clone -fの後、rebase --source E --dest D --detachを試しましたが、クラッシュしました:(

アイデア?

履歴を変更すると、リポジトリのクローンが無効になることは承知しています。この場合、これは問題ではありません。この作業の結果から、すべてのユーザーが再クローンを作成します。

4

3 に答える 3

2

解決しました!

私が最初に気づかなかったことの1つは、私の推定される共通の祖先が結局まったく同じではなかったということでした。Fooのリポジトリのsvn->hg変換中に、$ ID $文字列が拡張されましたが、Barのリポジトリの作成には含まれていませんでした。以下のステップ1は、REAL共通の祖先を作成するための簡単な修正です。

次の手順により、目標を達成することができました。

1-推定される共通の祖先(DとD')が実際に同一であることを確認します。そうでない場合は、バーのリポジトリにそれらの新しいスプライスポイント(S)を作成します。私の例では、SはD'の内容と正確に一致する必要があります。

    ... ABCD--JK --- L
              \ \ /
               S MN

2- Fooのリポジトリの履歴をトリミングして、D'を含む重複する履歴を削除します。

    hg convert --splicemap TrimSplicemap Foo FooTrimmed

TrimSplicemapの内容:(ここで、EはEの完全なハッシュです)

    E 0000000000000000000000000000000000000000

3- hg stripを使用して、切断された冗長な履歴を削除します

    cd FooTrimmed
    hgストリップC '

4-もう一度hgconvertを使用して、コミット'S'でFooの削除されたレポジトリをBarのレポジトリに接続します

    cd../Bar
    hg convert --splicemapFooBarSplicemap../FooTrimmed。

FooBarSplicemapの内容:(ここで、E'はFooTrimmedのEの新しいハッシュであり、SはSのハッシュです)

    E'S

それでいいはずです!:D

于 2011-05-06T17:19:09.083 に答える
1

MercurialQueuesを使用してこれを達成できる場合があります。

  1. Fooすべてのチェンジセットをリポジトリからパッチキューにインポートします。
  2. リポジトリに移動しBarます。
  3. Bar共通の祖先であるチェンジセットに更新します。
  4. パッチキューをにインポートしますBar
  5. パッチキューを適用します。

これにより、すべてのパッチのコミットIDが変更Fooされますが、履歴全体を保持し、それらの開発リポジトリをマージすることができます。

于 2011-05-05T20:18:06.787 に答える
1

私たちは今日IRCでこれについて話しました、そして私のアドバイスはただ両方を同じレポに引き込みそしてそれが2つのルーツを持つようにすることでした。頭はあなたが望む通りになり、残りは本当に重要ではありません。

あなたがそれを胃に入れることができないなら(あなたは人々が実際よりも歴史/非難を使うことを想像しています)、あなたのスプライスマップは次のようにすべきだと思います:

E D

Eの親をD(D'ではなく)にしようとしているので、

于 2011-05-06T02:51:51.640 に答える