使用git-svn将svn分支合并回主干,再将主干合并回分支

12

我正在使用git与svn仓库交互。

我有一个类似这样的svn TRUNK:

A-B-C-D

还有一个 SVN bug_fixes 分支,它是从提交 B 或 C 分支出的:

 -c-d-e-f-g-h-i
现在我需要将在我的svn分支中的cdefghi提交记录合并回主分支。
我知道我可以做一个压缩提交,让我们称之为SQUASH(其中包括cdefghi),但那样似乎我就必须删除bug_fixes分支并开始一个新的分支来继续开发。
在这里:http://blog.red-bean.com/sussman/?p=92 他们建议:
检出分支。
将主分支的更改合并到该分支。
检出主分支。
将该分支的更改使用“merge --reintegrate”合并到主分支。
继续开发。
不幸的是,git-svn似乎没有识别svn的任何“merge --reintegrate”命令。
那么我该如何使用git-svn的命令来使分支和主分支都有所有提交记录,以便两者都可以继续开发而不出现问题?

所以基本上,所有的解决方案都没有进行精确的重新集成,如果您继续使用它,所有的分支都会处于冲突状态? - Quartz
坦白地说,回顾这件事,我会做以下两件事之一:1.使用没有svn的git存储库。2.在git中执行所有合并和变基操作,而不使用能力较弱的svn分支,并使用git镜像(不带主分支)共享任何分支。如果必须共享任何分支,则只保留主分支在svn中。但总体而言,如果可能的话,我会放弃svn。 - Kzqai
5个回答

7

Git-svn文档中的注意事项部分警告:

为了简单起见并与一个功能较弱的系统(SVN)互操作,建议所有git svn用户直接从SVN服务器进行clonefetchdcommit,避免在git存储库和分支之间进行所有git clone/pull/merge/push操作。

作者提供了建议:

在git分支和用户之间交换代码的推荐方法是使用git format-patchgit am或只需将其dcommit到SVN存储库。

根据你的情况进行适应。

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

在你的历史记录中,ci是适当的提交标识符。


这使我能够将所有提交应用于主干,但不允许我继续在分支上开发。不幸的是,由于svn具有线性修订历史记录,似乎推荐的做法实际上是将分支合并到主干,然后删除该分支并创建一个同名的分支。 - Kzqai

3

好的,我找到了几种方法:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

或者

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

或者

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

然后,在所有这些之后。

git svn dcommit (to commit to master)
git branch -D your_branch

然后(从svn中,因为git-svn不支持删除)删除该分支,并从主干重新创建它,然后再开始整个循环。


如何从svn获取分支?它存储在那里... 不在本地存储库中。 - holms
我认为这只是一个“Git svn fetch”或类似的问题。http://www.kernel.org/pub/software/scm/git/docs/git-svn.html - Kzqai
我认为你应该真正执行 git svn rebase。 根据 https://git-scm.com/docs/git-svn#git-svn-emrebaseem 的文档,它应该保留线性历史。 - Paul

1
你也可以进行 cherry-pick,前提是你不使用 merge
这两个语句都应该在没有更改的分支上执行。
前提是 c 比 i 旧,并且你想要取整个序列。
git cherry-pick c..i

或者分开提交

git cherry-pick c d e f g h i

1

这不是一个将本地代码(<branchpoint>..i)基于从 SVN 获取的新主干进行变基的好例子吗?


这在git中很有效,但在svn的线性修订历史中却不行。因此,您可以将更改从分支获取到主干,但在分支上继续开发似乎是徒劳无功的。 - Kzqai

1
如果您提交合并请求,它会自动将其压缩为1个提交。不幸的是,它没有内部使用svn:mergeinfo或--reintegrate,因此您将失去通过'git svn branch'创建的分支的关联。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接