我使用的代码来自CVS控制的存储库(@sourceforge)。我没有直接使用它,而是使用了别人制作的git克隆。在我的克隆中,我做了几处修改。
与此同时,上游项目已经切换到SVN (@googlecode)。我自己创建了一个自动更新的git克隆。
现在,我想将我之前对CVS/git的修改应用到SVN/git中。不幸的是,对于相同的提交,SHA是不同的。
发布于 2010-10-31 13:37:03
假设您的补丁位于单个线性序列中,您可以使用"git format-patch"和"git am"轻松完成此操作。首先,将新的存储库切换到您的更改应该从中萌发的修订版本,并创建一个新分支来保存您的更改:
cd $NEWREPO
git checkout -b my-changes $SPROUT_POINT然后使用"git format- R1..R2“导出您想要迁移的提交的范围补丁,并使用"git am”将它们应用到新的存储库中:
(cd $OLDREPO; git format-patch -k --stdout R1..R2) | (cd $NEWREPO; git am -k)我建议首先将补丁应用到对应于CVS修订版的修订版,补丁最初是从CVS修订版中产生的,因为这样做应该会成功,没有任何冲突。然后,如果需要,在新的存储库中使用"git rebase"将提交移动到适当的Subversion分支的顶端。
发布于 2010-11-01 20:26:05
另一种选择是从您的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)https://stackoverflow.com/questions/4052919
复制相似问题