使用git-svn将svn分支合并回trunk和trunk回到分支

时间:2010-01-29 19:45:51

标签: svn git branch reintegration

所以我正在使用git并与svn repo进行交互。

我有一个看起来像这样的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他们建议:

checkout分支。

merge主人对分支的更改。

Checkout主人。

merge --reintegrate分支机构对主人的更改。

继续发展。

不幸的是,git-svn似乎没有认识到svn的任何“merge --reintegrate”命令。

那么我如何干净地使分支和master拥有所有提交,以便使用git-svn的命令继续开发两者?

5 个答案:

答案 0 :(得分:7)

Caveats section of the git-svn documentation发出警告

  

为了简化并与功能较弱的系统(SVN)进行互操作,建议所有git svn用户clonefetchdcommit直接来自SVN服务器,并避免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是您历史记录中提交的适当标识符。

答案 1 :(得分: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不支持删除)删除分支, 并从主干重新创建它并重新开始循环。

答案 2 :(得分:1)

将您的本地资源(<branchpoint>..i)重新定位到从SVN获取的新主服务器时,这不是一个好的案例吗?

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果你不使用 merge ,你还能做的是 cherry-pick

两个语句都应该在没有更改的分支上完成。

如果c比我年长,并且您想要采用整个序列。

git cherry-pick c..i

或单独提交

git cherry-pick c d e f g h i