2

我正在使用来自 CVS 控制的存储库 (@sourceforge) 的代码。我没有直接使用它,而是使用了其他人制作的 git clone。在我的克隆中,我有几个修改。

与此同时,上游项目已切换到 SVN (@googlecode)。我能够自己创建一个自动更新的 git 克隆。

现在我想将我之前对 CVS/git 的修改应用到 SVN/git 中。不幸的是,对于相同的提交,SHA 是不同的。

4

2 回答 2

1

假设你的补丁是一个单一的线性序列,你可以使用"git format-patch""git am"很容易地做到这一点。首先将新存储库切换到您的更改应该从中萌芽的修订版,并创建一个新分支来保存您的更改:

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 repo 中完成)

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 回答