我正在使用来自 CVS 控制的存储库 (@sourceforge) 的代码。我没有直接使用它,而是使用了其他人制作的 git clone。在我的克隆中,我有几个修改。
与此同时,上游项目已切换到 SVN (@googlecode)。我能够自己创建一个自动更新的 git 克隆。
现在我想将我之前对 CVS/git 的修改应用到 SVN/git 中。不幸的是,对于相同的提交,SHA 是不同的。
我正在使用来自 CVS 控制的存储库 (@sourceforge) 的代码。我没有直接使用它,而是使用了其他人制作的 git clone。在我的克隆中,我有几个修改。
与此同时,上游项目已切换到 SVN (@googlecode)。我能够自己创建一个自动更新的 git 克隆。
现在我想将我之前对 CVS/git 的修改应用到 SVN/git 中。不幸的是,对于相同的提交,SHA 是不同的。
假设你的补丁是一个单一的线性序列,你可以使用"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 分支的尖端。
其他选择是从 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)