我使用代码从CVS控制存储库(@sourceforge)。我没有直接使用它,而是使用其他人制作的git克隆。在我的克隆中,我有几个修改。合并两个git仓库,一个一个git-CVS克隆,一个GIT中 - svn的克隆
在此期间上游项目已经切换到SVN(@googlecode)。我能够自己创建一个自动更新的git克隆。现在
我想我以前的CVS/GIT中的修改应用到SVN/git的。对于相同的提交,SHA很不幸。
我使用代码从CVS控制存储库(@sourceforge)。我没有直接使用它,而是使用其他人制作的git克隆。在我的克隆中,我有几个修改。合并两个git仓库,一个一个git-CVS克隆,一个GIT中 - svn的克隆
在此期间上游项目已经切换到SVN(@googlecode)。我能够自己创建一个自动更新的git克隆。现在
我想我以前的CVS/GIT中的修改应用到SVN/git的。对于相同的提交,SHA很不幸。
假设你的补丁是一个单一的线性序列,你可以很容易地使用"git format-patch"和"git am"来做到这一点。首先,新的存储库请切换到您的更改应该萌芽的修订,并创建一个新的分支来保存您的更改:
cd $NEWREPO
git checkout -b my-changes $SPROUT_POINT
然后使用“git的格式补丁”的范围R1..R2提交出口的那要迁移和“混帐上午”在新的仓库应用它们:
(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上游所有的提交,“将它们连接”到你最后的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 - 我 - J,只是具有不同的散列
你检查分支的更改,并运行:
git rebase --onto J D
从而改变了局势:
svn-repo: G -- H -- I -- J (last_svn_commit) -- E' -- F' (your changes, rebased)
谢谢。这可能也会起作用,因为之前的方法对我来说没有测试过。 – mab 2010-11-02 15:07:27
应该是“git的结帐-b我-变化$ SPROUT_POINT”而不是“git的合作......” – mab 2010-11-01 08:55:53
感谢;改变。我想不是每个人都使用和我一样的别名:-) – mhagger 2010-11-01 12:05:11