8

私のプロジェクトFakeItEasyの VCS をGoogle Code で SVN から Mercurial に変更するとき、私は少し熱心すぎました (私はそのように面白いです)。私がしたことは、SVN から最新バージョンをチェックアウトし、そのチェックアウトを新しい Mercurial リポジトリの最初のリビジョンとしてコミットすることでした。これは明らかに、すべての履歴が失われるという効果があります。

後で Mercurial に少し慣れてきたとき、SVN リポジトリを Mercurial リポジトリに変換できる「変換拡張機能」のようなものがあることに気付きました。ここでやりたいことは、古い SVN リポジトリを変換し、Mercurialへの最初のコミットを除いて、現在既存の Mercurial リポジトリからすべての変更セットをこの変換されたリポジトリにインポートすることです。

SVN リポジトリをローカルの Mercurial リポジトリに変換しましたが、今は行き詰まっています。convert 拡張機能を使用して、現在の Mercurial リポジトリを変換されたリポジトリに移動し、スプライス マップを使用して最初のコミットを削除できると思っていましたが、これを機能させることはできません。

また、スプライス マップなしで変換を使用して、現在の Mercurial リポジトリから変換されたものにすべての変更セットを取得し、現在の 2 番目のバージョンを古い SVN リポジトリからの最後のコミットにリベースしようとしましたが、取得できませんどちらかが機能すること。

これを明確にするために、次の 2 つのリポジトリがあるとします。

A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)

次に、これら 2 つを組み合わせて、これを含む新しいリポジトリにします。

C: revA1-revA2-revB2-revB3
4

2 に答える 2

12

新しいリビジョンのハッシュを変更している限り (そうです)、exportand import(またはtransplant2 つのラッパーであるコマンド) を使用することもできます。

あなたはすでに変換を行っています。これは素晴らしいことです。レポ B に移動して、次のことを行います。

hg export -o 'changeset-%R.patch' 1:tip

これにより、レポ B の各変更セットに対して、最初の変更セット (0 番) を除いて、changeset-##.patch が作成されます。

レポ C に移動してインポートします。

hg import $(ls *.patch | sort -V)

実際に revA2 と revB1 が同一である場合、それはすべてき​​れいに適用されるはずです。

于 2010-04-21T16:45:14.637 に答える
0

「hgpul--force」を使用して、無関係のリポジトリから変更をプルできます。

簡単な使用例を次に示します。

テストディレクトリを設定する

C:\temp>mkdir hgtest
C:\temp>cd hgtest
C:\temp\hgtest>mkdir a
C:\temp\hgtest>mkdir b
C:\temp\hgtest>mkdir c

リポジトリを

C:\temp\hgtest>cd a
C:\temp\hgtest\a>hg init
C:\temp\hgtest\a>echo line one >> file.txt
C:\temp\hgtest\a>hg add file.txt
C:\temp\hgtest\a>hg ci -m "check in one"
C:\temp\hgtest\a>echo line two >> file.txt
C:\temp\hgtest\a>hg ci -m "check in two"
C:\temp\hgtest\a>echo line three >> file.txt
C:\temp\hgtest\a>hg ci -m "check in three"

リポジトリを作成するb

C:\temp\hgtest\a>cd ..\b
C:\temp\hgtest\b>copy ..\a\file.txt file.txt
C:\temp\hgtest\b>hg init
C:\temp\hgtest\b>hg add file.txt
C:\temp\hgtest\b>hg ci -m "check in b one"
C:\temp\hgtest\b>echo line four >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b two"
C:\temp\hgtest\b>echo line five >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b three"

リポジトリcを最初にaのクローンとして作成し、次にbから変更をプルします。

C:\temp\hgtest\b>cd ..\c
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a .
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b
C:\temp\hgtest\c>hg merge
C:\temp\hgtest\c>hg ci -m "check in c one"
于 2010-04-21T17:16:49.090 に答える