我正在使用BitBucket的Subgit插件将svn存储库镜像为git存储库。只有trunk分支(在git中称为master)已标记为同步,但使用git存储库的开发人员已创建了一个功能分支,并向git分支提交了十二个提交(未进行同步)。
现在两个分支都有几个提交,我们想要将git功能分支合并回trunk svn分支。如果以下方法可行,则子标准文档并不完全清楚:
git checkout master
git merge feature
git push
另外需要注意的是,合并将需要合并提交,因为必须解决冲突。
答案 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个案例中的一个。
您的其他问题如何:
不,它不会取决于你对乱七八糟的定义。有些人更喜欢“案例2”,称“案例3”为混乱,其他人则持相反意见。在任何一种情况下,您都可以配置加载项以实现所需的行为。
在案例1和案例2中 - 是的,在案例3中 - 否,它们将被压缩为单个SVN修订版。在所有情况下,个别 Git 提交将保持原样。
你可以,但我不建议你这样做。一般来说,我建议使用git pull --rebase
而不是git pull
。但是当合并一个特征分支时,最好合并它而不是重新绑定它。如果你重新定义它,你会直接在主服务器中看到来自功能分支的单独提交(因此在SVN主干中),这部分是可以的。但是功能分支参考将被更新,您将不得不
--force
选项推送更新的功能分支参考,一般不推荐使用; OR 这与SubGit无关(SubGit只会将其在'master'中找到的内容转换为SVN trunk),但会在纯Git中造成不便。
我是SubGit开发人员之一。