2

CVS制御リポジトリ(@sourceforge)のコードを使用しています。直接使用する代わりに、他の誰かが作成したgitクローンを使用していました。私のクローンにはいくつかの変更があります。

その間に、アップストリームプロジェクトはSVN(@googlecode)に切り替わりました。自分で自動的に更新されるgitクローンを作成することができました。

ここで、CVS/gitの以前の変更をSVN/gitに適用したいと思います。残念ながら、SHAは同じコミットでは異なります。

4

2 に答える 2

1

パッチが単一の線形シーケンスにあると仮定すると、「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ブランチの先端に移動します。

于 2010-10-31T05:37:03.037 に答える
0

他のオプションは、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)
于 2010-11-01T12:26:05.420 に答える