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

Merge git branch onto svn branch using subgit

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

现在两个分支都有多个提交,我们想将 git 功能分支合并回 trunk svn 分支。 subgit 文档并不完全清楚以下是否可行:

git checkout master
git merge feature
git push

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

这个工作流程

git checkout master
git merge feature
git push

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

git merge --no-ff feature

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

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

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

shelves = shelves/*:refs/shelves/*

但确切的值并不重要。 在这种情况下,"git push" 将推送来自主分支和功能分支的所有提交(即使您没有明确推送功能分支),因为提交将可以通过 "merge commit parent" link 访问。另一方面,特性分支Git引用不会被推送,所以SubGit无法知道特性分支的名字。在这种情况下,SubGit 将在 SVN 的 'shelves' 命名空间中发明一些临时名称,例如shelves/shelf 对应特性分支的提交。然后它 将这些单独的提交逐一转换为 SVN。最后它会在SVN主干中创建一个merge commit,updating svn:mergeinfo;毕竟它 将删除 SVN 中的 shelves/shelf (但你可以使用旧版本引用它,Subversion 永远不会忘记)。

为了更好地理解这一点,我推荐这个 post。第二张图片对应的是这种情况,例如Case 2,而第一个为Case 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 存储库吗?

不,虽然这取决于您对乱七八糟的定义。有些人喜欢"Case 2",称"Case 3"乱七八糟,其他人则持相反意见。在任何一种情况下,您都可以配置附加组件以实现您想要的行为。

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

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

  • 或者我应该将功能分支重新设置为 master 分支然后推送?

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

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

这与 SubGit 无关(SubGit 只会将它在 'master' 中找到的内容转换为 SVN 主干),但会在纯 Git.

我是 SubGit 开发人员之一。