使用subgit将git分支合并到svn分支上

时间:2017-01-10 23:19:33

标签: git svn merge subgit

我正在使用BitBucket的Subgit插件将svn存储库镜像为git存储库。只有trunk分支(在git中称为master)已标记为同步,但使用git存储库的开发人员已创建了一个功能分支,并向git分支提交了十二个提交(未进行同步)。

现在两个分支都有几个提交,我们想要将git功能分支合并回trunk svn分支。如果以下方法可行,则子标准文档并不完全清楚:

git checkout master
git merge feature
git push

另外需要注意的是,合并将需要合并提交,因为必须解决冲突。

  • 这个工作流程是否支持subgit?
  • 这会搞乱SVN回购吗?
  • 是否会保留功能分支上的所有个人提交?
  • 或者我应该将功能分支重新设置为主分区,然后按?

1 个答案:

答案 0 :(得分:2)

此工作流程

git checkout master
git merge feature
git push
SubGit支持

(在这种情况下无关紧要,但我建议使用

git merge --no-ff feature

防止快进合并);结果取决于您的配置。我将描述几个案例。

案例1.(不是你的情况,但知道有用)如果 主干和分支配置为由SubGit同步。在这种情况下,效果等同于“svn merge”命令:svn:mergeinfo将被更新。当然,功能分支中的单个提交也将进入SVN,因为功能分支已配置为同步。

案例2(我的情况,我认为,检查'shelf ='选项以确定)只有中继被配置为翻译,特征分支不是;并且你在存储库的SVN Mirror附加设置中设置了'shelves ='选项,通常选项如下:

shelves = shelves/*:refs/shelves/*

但确切的值无关紧要。 在这种情况下,“git push”将推送来自master和feature分支的所有提交(即使你没有显式推送功能分支),因为提交将通过“merge commit parent”链接到达。另一方面,不会推送功能分支Git引用,因此SubGit 无法知道功能分支的名称。在这种情况下,SubGit将在SVN的'shelf'命名空间中发明一些临时名称,例如shelves/shelf对应于功能分支的提交。然后 将这些单独的提交逐个转换为SVN。最后,它将在SVN中继中创建合并提交,更新 svn:mergeinfo;毕竟将删除 SVN中的shelves/shelf(但您可以使用较旧的版本引用它,Subversion永远不会忘记)。

要明白这一点,我建议post。第二张图片对应于这种情况,例如案例2,而第一个案例1。

案例3.(不是你的情况,但有些用户更喜欢这种行为)只有中继被配置为翻译,而功能分支不是;并且你根本没有'shelf ='选项。在这种情况下,SVN中的功能分支中的所有单个提交都将被忽略svn:mergeinfo不会更新。因此,您将在SVN中继中获得所有更改,但不是单独提交,而是作为单个SVN提交,所有更改都被压缩在一起,就好像您正在使用

git merge --squash feature

而不是

git merge feature

请注意,在Git端,各个提交仍将保留,它们不会被翻译为单独的修订。

我还要补充一点,在SVN Mirror插件中不仅支持此工作流,而且您或您的团队成员可以使用Bitbucket Server UI创建Pull Request,然后使用UI合并它。在这种情况下的行为与使用“git merge”+“git push”大致相同,即它将是上述3个案例中的一个。

您的其他问题如何:

  • 这会搞乱SVN回购吗?

不,它不会取决于你对乱七八糟的定义。有些人更喜欢“案例2”,称“案例3”为混乱,其他人则持相反意见。在任何一种情况下,您都可以配置加载项以实现所需的行为。

  • 是否会保留功能分支上的所有个人提交?

在案例1和案例2中 - 是的,在案例3中 - 否,它们将被压缩为单个SVN修订版。在所有情况下,个别 Git 提交将保持原样。

  • 或者我应该将功能分支重新设置为主分区,然后按?

你可以,但我不建议你这样做。一般来说,我建议使用git pull --rebase而不是git pull。但是当合并一个特征分支时,最好合并它而不是重新绑定它。如果你重新定义它,你会直接在主服务器中看到来自功能分支的单独提交(因此在SVN主干中),这部分是可以的。但是功能分支参考将被更新,您将不得不

  1. 使用--force选项推送更新的功能分支参考,一般不推荐使用; OR
  2. 保持功能分支不变,因此本地具有不一致的功能分支引用,并且其提交重复两次:在'master'和功能分支中。
  3. 这与SubGit无关(SubGit只会将其在'master'中找到的内容转换为SVN trunk),但会在纯Git中造成不便。

    我是SubGit开发人员之一。