2010-10-29 138 views
2

我使用代码从CVS控制存储库(@sourceforge)。我没有直接使用它,而是使用其他人制作的git克隆。在我的克隆中,我有几个修改。合并两个git仓库,一个一个git-CVS克隆,一个GIT中 - svn的克隆

在此期间上游项目已经切换到SVN(@googlecode)。我能够自己创建一个自动更新的git克隆。现在

我想我以前的CVS/GIT中的修改应用到SVN/git的。对于相同的提交,SHA很不幸。

回答

1

假设你的补丁是一个单一的线性序列,你可以很容易地使用"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分支的提示。

+0

应该是“git的结帐-b我-变化$ SPROUT_POINT”而不是“git的合作......” – mab 2010-11-01 08:55:53

+0

感谢;改变。我想不是每个人都使用和我一样的别名:-) – mhagger 2010-11-01 12:05:11

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上游所有的提交,“将它们连接”到你最后的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) 
+0

谢谢。这可能也会起作用,因为之前的方法对我来说没有测试过。 – mab 2010-11-02 15:07:27