CVS制御リポジトリ(@sourceforge)のコードを使用しています。直接使用する代わりに、他の誰かが作成したgitクローンを使用していました。私のクローンにはいくつかの変更があります。
その間に、アップストリームプロジェクトはSVN(@googlecode)に切り替わりました。自分で自動的に更新されるgitクローンを作成することができました。
ここで、CVS/gitの以前の変更をSVN/gitに適用したいと思います。残念ながら、SHAは同じコミットでは異なります。
CVS制御リポジトリ(@sourceforge)のコードを使用しています。直接使用する代わりに、他の誰かが作成したgitクローンを使用していました。私のクローンにはいくつかの変更があります。
その間に、アップストリームプロジェクトはSVN(@googlecode)に切り替わりました。自分で自動的に更新されるgitクローンを作成することができました。
ここで、CVS/gitの以前の変更をSVN/gitに適用したいと思います。残念ながら、SHAは同じコミットでは異なります。
パッチが単一の線形シーケンスにあると仮定すると、「gitformat-patch」と「gitam 」を使用してこれを非常に簡単に行うことができます。まず、新しいリポジトリを、変更が発生するリビジョンに切り替え、変更を保持するための新しいブランチを作成します。
cd $NEWREPO
git checkout -b my-changes $SPROUT_POINT
次に、「git format-patch」を使用して、移行するコミットの範囲R1..R2をエクスポートし、「git am」を使用して、それらを新しいリポジトリに適用します。
(cd $OLDREPO; git format-patch -k --stdout R1..R2) | (cd $NEWREPO; git am -k)
最初にパッチを元のCVSリビジョンに対応するリビジョンに適用することをお勧めします。これは、競合なしで成功するはずだからです。次に、必要に応じて、新しいリポジトリ内で「git rebase」を使用して、コミットを適切なSubversionブランチの先端に移動します。
他のオプションは、CVSリポジトリから変更をプルし、SVNリポジトリに基づいて変更することです。このように(svnリポジトリで行われるすべて)
git remote add cvs-repo /path/to/you/cvs/clone
git fetch cvs-repo
git checkout -b my-branch-with-changes cvs-repo/my-branch-with-changes
git rebase --onto ${SVN_UPSTREAM} ${CVS_UPSTREAM}
最後git rebase
は、cvs-upstreamに基づいてすべてのコミットを取得し、最後のSVNに「接続」する必要があります。
グラフィックの場合:
cvs-repo: A -- B -- C -- D (last_cvs_commit) -- E -- F (your changes)
svn-repo: G -- H -- I -- J (last_svn_commit)
(ここで、A--B--C--DはG--H--I--Jと同一であり、ハッシュが異なるだけです。
変更を加えてブランチをチェックアウトし、以下を実行します。
git rebase --onto J D
これにより、状況が次のように変わります。
svn-repo: G -- H -- I -- J (last_svn_commit) -- E' -- F' (your changes, rebased)