git-svn:如何将git提交从一个SVN分支复制到另一个SVN分支?

时间:2009-07-10 21:26:49

标签: git version-control git-svn

我有一个git-svn签出我的整个仓库(以标准git svn init -t tags -b branches -T trunk $repo_url方式初始化,然后git svn fetch ed)。我手动svn copy $repo_url/branches/branch1 $repo_url/branches/branch2。然后我运行了git svn fetchgit checkout -b local-branch2 branch2,向branch2做了一些提交,dcommit将它们发送回SVN回购,并完成了我在{{1}上的工作}。 (为什么要分支一个分支?我想在git本地破解这个分支,但是在我工作的时候仍然会回到SVN并从几个同事那里得到帮助。)

我还没有做的是将branch2工作合并回branch2。如果我branch1,然后是git checkout -b local-branch1 branch1,则只需将git merge branch2指针快速转发到local-branch1所在的位置。

相反,我希望git重放自从branch2启动到branch1之后所做的所有提交,这样我就可以将它们中的每个提交到SVN repo。似乎有办法做到这一点,但我想不到它。可能branch2git rebase每次提交git cherry-pick? (虽然后者有点乏味)。我宁愿不将这两个URL合并在一起,因为那是一个很大的伤害。

想法?这需要更多解释吗?

1 个答案:

答案 0 :(得分:6)

branch2上第一次不在local-branch1上的提交可能是创建branch2的提交,是吗?这应该在git中显示为空提交(例如,消息,但没有内容)。复制其sha1标识符。然后在local-branch1中,尝试git reset --hard branch2 && git rebase --onto local-branch1@{1} SHA1(其中SHA1是复制的sha1)。这应该重播所有提交,除了空的一个返回到分支1.你很可能现在想要做一个交互式rebase并编辑每个提交,这样你就可以去掉git-svn-id:git-svn为你添加的行(或者如果有足够的提交,你可以编写一个git-filter-branch脚本来执行此操作)。

出于好奇,你为什么要重播每个提交?如果您只想简单地合并您的更改,则更简单,您可以git checkout local-branch1 && git merge --squash branch2 && git commit。这将执行非快进合并,但它实际上不会产生合并提交(因为那些混淆了git-svn)。相反,它会产生等效的工作树,就好像合并已经发生,但只有一个父。这反映了svn合并的工作原理。