2010-01-29 247 views
11

所以我使用git并与svn repo进行交互。使用git-svn将svn分支合并回trunk和trunk回到分支

我有一个SVN主干,看起来像这样:

A-B-C-D 

而且一个svn bug_fixes分支,关闭在提交B或C分支:

-c-d-e-f-g-h-i 

现在我需要得到cdefghi承诺那是在我的svn分支回到主分支。我知道我可以做一个压扁的提交,我们称它为squash SQUASH(它将包含cdefghi),但是看起来好像我必须杀死bug_fixes分支并启动一个新分支以干净地继续。

这里:http://blog.red-bean.com/sussman/?p=92他们建议:

checkout分支。

merge主人对分支的更改。

Checkout高手。

merge --reintegrate该分支的变化到主。

继续发展。

不幸的是,git-svn似乎无法识别svn的任何“merge --reintegrate”命令。

那么我该如何干净地让分支和主人有所有的提交,以便使用git-svn的命令来继续开发呢?

+0

所以基本上,没有一个解决方案,做一个确切的重返社会,都留下冲突的分支,如果你继续使用它? – Quartz 2013-08-01 16:23:04

+0

坦率地说,回头看这个,我会做这两件事情之一:1.使用没有svn的git回购。 2.使用一个中央svn回购,并在git中完成所有的合并和重新分配,而不使用功能较弱的svn分支。如果我不得不分享任何分支,我会这样做在一个Git镜像 - 没有 - 主分支,并只保留在SVN的主分支。但总体来说,如果可能的话,我会放弃svn。 – Kzqai 2013-08-01 20:30:57

回答

7

Caveats section of the git-svn documentation警告

为了简单起见,用一个能力较少的系统(SVN)互操作,则建议所有git svn用户clonefetch和从SVN服务器dcommit直接,避免所有git clone/pull/merge/push git存储库和分支之间的操作。

笔者确实提供了一个建议:

的Git分支和用户之间交换代码的推荐方法是git format-patchgit am,或者只是dcommit荷兰国际集团到SVN仓库。

适应您的情况

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

其中ci是在历史上提交相应的标识符。

+0

这允许我将所有提交应用于主干,但不允许我继续在分支上进行开发。不幸的是,由于svn具有线性修订历史,因此建议的操作过程似乎是将分支合并到trunk中,然后删除分支并创建一个相同的名称。 – Kzqai 2010-02-01 00:06:55

1

这不是一个很好的情况下重新分配您的本地东西(<branchpoint>..i)到从SVN获取的新主控?

+0

这在git中运行良好,但不适用于svn的线性修订历史记录。所以你可以从分支变成分支,但分支之后的继续开发显然是徒劳的。 – Kzqai 2010-02-01 00:14:49

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因为混帐SVN不支持删除)删除分支, 和躯干重建,并重新开始循环。

+0

如何从svn获取分支?它存储在那里..不在本地回购。 – holms 2013-02-20 15:05:50

+0

我认为这只是“Git svn fetch”的问题。 http://www.kernel.org/pub/software/scm/git/docs/git-svn.html – Kzqai 2013-02-20 16:26:19

+0

我认为你应该做一个'git svn rebase'来代替。 根据https://git-scm.com/docs/git-svn#git-svn-emrebaseem上的文档,它应该保留线性历史记录 – Paul 2017-01-24 10:18:12

1

如果你提交一个合并,它会自动将它压缩到1次提交中。可悲的是,它不会在内部使用svn:mergeinfo或--reintegrate,因此它会失去与通过'git svn branch'创建的分支的关联。

1

你还可以做的是cherry-pick,前提是你不会使用合并

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

只要c比我年长,并且你想要接受整个序列。

git cherry-pick c..i 

或者单独提交

git cherry-pick c d e f g h i 
相关问题