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


所以我使用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的命令继续开发两者?


936
2018-01-29 19:45


起源

所以基本上,没有一个解决方案完全重新整合,如果你继续使用它,所有这些都会让分支发生冲突吗? - Quartz
坦率地说,回头看看,我会做以下两件事之一:1。使用没有svn的git repo。 2.使用一个中央svn repo,在git中完成所有的合并和变基,而不使用功能较弱的svn分支。如果我必须共享任何分支,我将在git镜像中执行此操作 - 不使用主分支,并仅在svn中保留主分支。但总的来说,如果可能的话,我会免除svn。 - Kzqai


答案:


警告部分 git-svn 文件 警告

为了简化和与功能较弱的系统(SVN)进行互操作,建议全部使用 git svn 用户 clonefetch 和 dcommit 直接来自SVN服务器,避免全部 git clone/pull/merge/push git存储库和分支之间的操作。

作者提供了一个建议:

在git分支和用户之间交换代码的推荐方法是 git format-patch 和 git am, 要不就 dcommit进入SVN存储库。

适应您的情况

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

哪里 c 和 i 是历史记录中提交的适当标识符。


7
2018-01-29 21:23



这允许我将所有提交应用到主干,但不允许我继续在分支上进行开发。不幸的是,由于svn有一个线性修订历史,似乎推荐的行动方案实际上是将分支合并到trunk,然后删除分支并创建一个相同的名称。 - Kzqai


好的,我找到了一些方法:

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


3
2018-02-01 00:29



如何从svn获得分支?它存储在那里..不在本地回购。 - holms
我认为这只是“Git svn fetch”的问题。 kernel.org/pub/software/scm/git/docs/git-svn.html - Kzqai
我想你应该真的做到 git svn rebase 代替。它应该根据文档保存线性历史记录 git-scm.com/docs/git-svn#git-svn-emrebaseem - Paul


这不是一个改变当地东西的好例子(<branchpoint>..i)从SVN获取的新主服务器?


1
2018-01-31 13:46



这在git中运行良好,但不适用于svn的线性修订历史。因此,您可以从分支到主干获得更改,但之后在分支上继续开发显然是徒劳的。 - Kzqai


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


1
2018-06-17 19:34





你还能做的是 摘樱桃,只要你不会使用 合并

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

假设c比我年长并且您想要采用整个序列。

git cherry-pick c..i

或单独提交

git cherry-pick c d e f g h i

1
2017-10-23 12:00