2016-03-15 188 views
1

在Gerrit中处理特性分支时,我想将我的特性分支更改推送到主模块(以便其他人可以使用它)以及我的功能分支(所以我可以继续努力,而不需要对主人进行更改),但是一旦我推到一个分支,我就不能将gerrit推向另一个分支。Gerrit将相同的变更集推送给主分支和分支

例如,如果我git push HEAD:refs/for/master那么,随后的git push HEAD:refs/for/feature将导致:

Total 0 (delta 0), reused 0 (delta 0) 
remote: Processing changes: refs: 1, done  
To ssh://gerrit.server/repo.git 
! [remote rejected] HEAD -> refs/for/feature (no new changes) 
error: failed to push some refs to 'ssh://gerrit.server/repo.git' 

当然也有新的变化,但只是针对不同的分支。

目前,我有两个选择:

  1. 推到特性分支,得到它的测试,审查提交&,然后手动将它并入主控和获取测试,审查提交的&。

    • 这里的问题是,如果其他的变化都合并到主我拉着主人之间做合并和我的合并提交提交,那么我们最终得到一个额外的不必要的合并。
  2. 推主,得到它的测试,审查提交&,然后让我们的格里特大师更新格里特特性分支裁判在那里它需要。

    • 除了被黑客攻击之外,有可能导致严重错误,这不是你想让别人经常去做的事情。
    • CI服务器仅在主设备上运行测试,不在分支上。

这些解决方案都不是很令人满意。

理想我想只推到功能分支,然后推到和有格里特意识到,第二个推动是让提交(或提交)合并,以掌握;或者可选地,推送到主服务器然后推送到特性分支,并让gerrit意识到这只是一个请求来快速转发特性分支引用。不幸的是,我还没有找到任何方法来做到这一点。

是否有一种干净的方式将更改或一组更改推送到它们的功能分支和主控?


注意,我们有合并,基于工作流程,而不是基于重订工作流程,所以它依赖于重订工作流程的答案会不会对我们有用。

在发现Selecting Merge Base我以为base选择是什么,我一直在寻找,但是当我尝试git push origin HEAD:refs/for/master其次是git push origin HEAD:refs/for/feature%base=$(git rev-parse origin/feature)推到功能分支以同样的方式失败,好像我刚做git push origin HEAD:refs/for/feature即它说[remote rejected]由于(no new changes)


我们也试图使在格里特项目配置create-new-change-for-all-not-in-target选项,但它在完全相同的方式失败:

$git commit -am "New commit for feature and master." 
[fix 1234567] New Commit 
19 files changed, 19 insertions(+), 19 deletions(-) 

$git push origin HEAD:refs/for/master 
Counting objects: 48, done. 
Delta compression using up to 12 threads. 
Compressing objects: 100% (25/25), done. 
Writing objects: 100% (25/25), 2.20 KiB, done. 
Total 25 (delta 24), reused 0 (delta 0) 
remote: Resolving deltas: 100% (24/24) 
remote: Processing changes: new: 1, refs: 1, done  
remote: 
remote: New Changes: 
remote: http://gerrit.server/1234 New commit for feature and master. 
remote: 
To ssh://gerrit.server/repo.git 
* [new branch]  HEAD -> refs/for/master 

$git push origin HEAD:refs/for/feature 
Total 0 (delta 0), reused 0 (delta 0) 
remote: Processing changes: refs: 1, done  
To ssh://gerrit.server/repo.git 
! [remote rejected] HEAD -> refs/for/feature (no new changes) 
error: failed to push some refs to 'ssh://gerrit.server/repo.git' 

我也试图推动新特性分支,然后再mastedr,但如预期的那样,这导致相同的拒绝。

+0

您是否尝试过这种方法:先推送到第一个分支,然后签出第二个分支,将第一个分支合并到它中,然后推送。我认为问题在于你试图推送到不同于当前名称的分支。例如:在featureX上工作并推动主人 – CodeWizard

回答

1

说到Gerrit,我们使用的方法稍有不同。我们不保留主题分支,但我们使用Gerrit提供的变更主题。也就是说,您可以使用git push HEAD:refs/for/master/feature来代替git push HEAD:refs/for/feature提交有关主题的更改。 Gerrit将其视为这是一个提供“功能”的提交,它最终将合并到主人。您可以对同一主题进行多项更改(它们应该可以映射到开发计算机上的经典本地功能部件)。 Gerrit甚至通过更改主题提供了很好的过滤功能。

然后,如master更新,您可以重新整理您的整个主题并继续使用master中的代码开发该功能。当功能准备就绪时,它可以合并到主设备上。

这样的工作流程使您可以在工作/检查阶段使用主站的最新更改测试新功能。

+0

感谢您的想法fracz,但我并不想真正想通过尝试让我们的团队改变工作流程的麻烦。让我们使用当前的工作流程非常困难。我发现让你的工作流程成为你拥有的工具最简单的东西总是一个坏主意,而不是适应和修改你的工具,以使它们适合你的工作流程 - 因此寻找一种不需要我们的机会的解决方案流程。 –

+0

然后,IMO你的问题不是由Gerrit造成的。如果您想要更新主控分支,您必须将其与主控分支进行合并或重新绑定,然后按照G.Sylvie Davies的建议,将更改推送到远程设备。 – fracz

+0

虽然这是一个粗糙的问题。如果我们不使用gerrit,我可以高兴地将它推到分支上,并毫无问题地掌握(无需强制推送,我们会拒绝)。 gerrit的问题在于,如果我把gerrit推到分支上,然后gerrit将相同的变化推到master上,它会拒绝gerrit的推送,因为commit已经被推送到分支(两者都具有相同的Change-ID,所以gerrit认为他们是同样的变化)。 –

1

请参阅my answerGerrit with tracked feature branches:在Gerrit> = 2.11到take into account target branch when determining new changes to open中启用create-new-change-for-all-not-in-target选项也应该有助于您的情况。

+0

我们刚刚在Gerrit web Gui中为一个项目启用了这个设置,并试着做了一个功能分支推送,但是我们仍然因'没有新的改变'而得到'远程拒绝'。我们应该能够在项目级启用它,还是我们需要在其他任何地方启用它? –

+0

它应该只在项目级别启用它。但是,只有在启用该选项后才会对工作进行更改。即如果您之前已经推送了原始更改,启用此选项将不会将相同更改推送到其他分支工作。此选项启用后,还需要推送原始更改。 – sschuberth

+0

好吧,我已经更新了我的问题,并详细说明了当我尝试了您的建议时发生了什么。谢谢。 –