1

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

现在两个分支都有多个提交,我们希望将 git 功能分支合并回主干 svn 分支。如果以下内容可行,则 subgit 文档并不完全清楚:

git checkout master
git merge feature
git push

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

  • subgit 是否支持此工作流程?
  • 这会弄乱 SVN 回购吗?
  • 是否会保留功能分支上的所有单独提交?
  • 或者我应该只是将功能分支重新定位到 master 然后推送?
4

1 回答 1

2

此工作流程

git checkout master
git merge feature
git push

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

git merge --no-ff feature

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

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

案例2。(我认为您的情况,请检查'shelves ='选项以确保)只有主干配置为翻译,功能分支不是;并且您存储库的 SVN Mirror 附加设置中设置了 'shelves=' 选项,通常该选项如下所示:

shelves = shelves/*:refs/shelves/*

但确切的值并不重要。在这种情况下,“git push”将推送来自主分支和特性分支的所有提交(即使您没有明确推送特性分支),因为这些提交可以通过“合并提交父级”链接访问。另一方面,特性分支 Git 引用不会被推送,因此 SubGit无法知道特性分支的名称。在这种情况下,SubGit 将在 SVN 的“架子”命名空间中创造一些临时名称,例如shelves/shelf对应于功能分支的提交。然后它将这些单独的提交一一翻译成 SVN。最后它将在 SVN 主干中创建一个合并提交,更新 svn:mergeinfo;毕竟它会删除shelves/shelf在 SVN 中(但您可以使用旧版本来引用它,Subversion 永远不会忘记)。

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

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

git merge --squash feature

代替

git merge feature

请注意,在 Git 方面,单个提交仍将被保留,它们只是不会被翻译为单个修订。

我还要补充一点,在 SVN Mirror 附加组件中,不仅支持此工作流程,而且您或您的团队成员将使用 Bitbucket Server UI 创建一个拉取请求,然后使用 UI 将其合并。这种情况下的行为与使用“git merge”+“git push”时的行为大致相同,即它将是上述 3 种情况之一。

你的其他问题呢:

  • 这会弄乱 SVN 回购吗?

不,它不会,尽管这取决于你对混乱的定义。有些人更喜欢“案例2”,称“案例3”一团糟,另一些人则持相反意见。无论哪种情况,您都可以配置插件以实现您想要的行为。

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

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

  • 或者我应该只是将功能分支重新定位到 master 然后推送?

你可以,但我不建议你这样做。一般来说,我建议使用git pull --rebase而不仅仅是git pull. 但是当合并一个特性分支时,合并它比 rebase 更好。如果你重新设置它,你会直接在 master 中看到来自特性分支的单个提交(因此在 SVN 主干中),这部分没问题。但是功能分支参考将被更新,您将不得不

  1. 使用选项推送更新的特性分支参考,--force一般不推荐;或者
  2. 保持功能分支不变,因此在本地具有不一致的功能分支引用,并且其提交重复两次:在“主”和功能分支中。

这与 SubGit 无关(SubGit 只会将它在“主”中找到的内容转换为 SVN 主干),但会在纯 Git 中造成不便。

我是 SubGit 开发人员之一。

于 2017-01-11T14:05:00.680 回答