使用 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
另一件需要注意的事情是合并需要合并提交,因为存在必须解决的冲突。
- subgit 是否支持此工作流程?
- 这会弄乱 SVN 存储库吗?
- 是否会保留功能分支上的所有个人提交?
- 或者我应该将功能分支重新设置为 master 分支然后推送?
这个工作流程
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 中)看到来自功能分支的单独提交,这部分没问题。但是功能分支参考将被更新,你将不得不
- 使用
--force
选项推送更新的功能分支参考,一般不推荐;或者
- 保持特性分支不变,因此在本地具有不一致的特性分支引用并且它的提交重复两次:在'master'和特性分支中。
这与 SubGit 无关(SubGit 只会将它在 'master' 中找到的内容转换为 SVN 主干),但会在纯 Git.
我是 SubGit 开发人员之一。
我正在使用 BitBucket 的 Subgit 插件将 svn 存储库镜像为 git 存储库。只有 trunk 分支(在 git 中称为 master)被标记为同步,但是使用 git 存储库的开发人员已经创建了一个功能分支并向 git 分支提交了十几个提交(这未同步)。
现在两个分支都有多个提交,我们想将 git 功能分支合并回 trunk 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。(不是你的情况,但知道有用)如果 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 中)看到来自功能分支的单独提交,这部分没问题。但是功能分支参考将被更新,你将不得不
- 使用
--force
选项推送更新的功能分支参考,一般不推荐;或者 - 保持特性分支不变,因此在本地具有不一致的特性分支引用并且它的提交重复两次:在'master'和特性分支中。
这与 SubGit 无关(SubGit 只会将它在 'master' 中找到的内容转换为 SVN 主干),但会在纯 Git.
我是 SubGit 开发人员之一。