繁体   English   中英

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

[英]Merge git branch onto svn branch using subgit

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

现在,两个分支都有几次提交,我们想将git feature分支合并回主干svn分支。 subgit文档尚不完全清楚,是否可以使用以下功能:

git checkout master
git merge feature
git push

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

  • subgit支持此工作流程吗?
  • 这会搞乱SVN回购吗?
  • 是否会保留功能分支上的所有个人提交?
  • 还是应该将功能分支重新设置到master上,然后再推送?

这个工作流程

git checkout master
git merge feature
git push

由SubGit支持(在这种情况下没有关系,但是我建议使用

git merge --no-ff feature

防止快速合并); 结果取决于您的配置。 我将描述几种情况。

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

情况2。(我想您的情况是肯定的,请选中'shelves ='选项)仅将中继配置为要翻译,而功能分支未配置; 而且你 “货架=”选项SVN镜设置附加设置存储库,通常的选择是这样的:

shelves = shelves/*:refs/shelves/*

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

为了更好地理解,我推荐这篇文章 第二张图片对应于这种情况,例如案例2,而第一张图片对应于案例1。

情况3。(不是您的情况,但某些用户更喜欢这种行为)仅将中继配置为要翻译,而功能分支不是。 而且您根本没有 'shelves ='选项。 在这种情况下,功能分支中的所有单个提交都将在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提交都将被保留。

  • 还是应该将功能分支重新设置到master上,然后再推送?

您可以,但是我不建议您这样做。 通常,我建议使用git pull --rebase而不是git pull 但是,合并功能分支时,合并它比重新设置基础更好。 如果重新设置基础,您将直接在master中(因此在SVN干线中)看到来自功能分支的单个提交,这部分就可以了。 但是功能分支参考将被更新,您将必须

  1. 使用--force选项推送更新的功能分支引用,一般不建议这样做; 要么
  2. 保持要素分支不变,从而在本地具有不一致的要素分支引用,并且两次提交重复序列:在“主”和要素分支中。

这与SubGit无关(SubGit只会转换为SVN干线,它将在“主”中找到),但会给纯Git带来不便。

我是SubGit开发人员之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM