ある Mercurial リポジトリから別の Mercurial リポジトリに変更を追加する
-
30-09-2019 - |
質問
プロジェクトの VCS を変更する場合 フェイクイットイージー Google Code で SVN から Mercurial に変換するのに少し熱心になりすぎました (そんな私はおかしいのです)。私がやったことは、SVN から最新バージョンをチェックアウトし、そのチェックアウトを新しい Mercurial リポジトリの最初のリビジョンとしてコミットすることだけでした。これは明らかにすべての履歴が失われるという影響を及ぼします。
その後、Mercurial に少し慣れてきたとき、SVN リポジトリを Mercurial リポジトリに変換できる「変換拡張機能」のようなものがあることに気づきました。ここで私がやりたいのは、古い SVN リポジトリを変換し、現在の既存の Mercurial リポジトリからすべての変更セットをこの変換されたリポジトリにインポートすることです。 を除外する Mercurial への最初のコミット。
SVN リポジトリをローカルの Mercurial リポジトリに変換しましたが、ここで行き詰まってしまいます。変換拡張機能を使用して、現在の Mercurial リポジトリを変換されたリポジトリに取り込み、スプライス マップで最初のコミットを削除できると思いましたが、これを機能させることはできないようです。
また、スプライスマップなしで変換を使用して、現在のMercurialリポジトリから変換されたものにすべての変更セットを取得し、古いSVNリポジトリからの現在のコミットから最後のコミットまでの2番目のバージョンをリベースしようとしましたが、取得できませんそれはどちらでも機能します。
これを明確にするために、次の 2 つのリポジトリがあるとします。
A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)
次に、これら 2 つを結合して、これを含む新しいリポジトリを作成したいと思います。
C: revA1-revA2-revB2-revB3
解決
新しいリビジョンのハッシュを変更している限り(実際にそうしています)、単に使用したほうがよいでしょう export
そして import
(または transplant
この 2 つのラッパーであるコマンド)。
変換はすでに完了しています。これは素晴らしいことです。今度はリポジトリ B に移動して、次の操作を実行します。
hg export -o 'changeset-%R.patch' 1:tip
これにより、最初の (番号が 0) を除く、リポジトリ B 内の各チェンジセットに対して、changeset-##.patch が作成されます。
次に、リポジトリ C に移動してインポートします。
hg import $(ls *.patch | sort -V)
実際に revA2 と revB1 が同一であれば、これはすべて正しく適用されるはずです。
他のヒント
「HGプル - フォース」を使用して、無関係なリポジトリから変更を引き出すことができます
これが簡単な使用例です。
テストディレクトリをセットアップします
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"
最初にaのクローンとしてリポジトリcを作り、次に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"