Gerrit将相同的变更集推送到主分支和分支

时间:2016-03-15 17:04:31

标签: git gerrit

在Gerrit的一个功能分支上工作,我想将我的功能分支更改推送到 master (以便其他人可以使用它)以及我的功能分支(所以我可以继续工作而不需要对主人进行修改),但是一旦我推到一个分支,我就无法将其推向另一个。

例如,如果我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. 推送掌握,测试,审核&提交,然后让我们的gerrit大师将gerrit中的功能分支ref更新到它需要的位置。

    • 除了成为一个黑客,有可能出现严重错误之外,你不想让别人经常做的事情。
    • CI服务器仅在上运行测试,而不在分支上运行。
  3. 这些解决方案都不是很令人满意。

    理想情况下,我想推送到功能分支,然后推送到 master 并让gerrit意识到第二次推送是获取提交(或提交)合并为主人;或者,推送到主设备,然后推送到功能分支,并让gerrit意识到这只是快速转发功能分支ref的请求。不幸的是,我还没有找到任何办法。

    是否有一种干净的方式将更改或一组更改推送到其功能分支和主服务器?

    注意,我们有基于合并的工作流而不是基于rebase的工作流,因此依赖于rebase工作流的答案对我们没有用。

    发现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)

    我们还尝试在Gerrit项目配置中启用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,但正如预期的那样,这会导致相同的拒绝。

2 个答案:

答案 0 :(得分:1)

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

然后,当master更新时,您可以将整个主题更改为该主题,并继续使用master中的代码开发该功能。功能准备就绪后,可以将其合并到主服务器上。

此类工作流程使您可以在工作/审核阶段使用master的最新更改测试新功能。

答案 1 :(得分: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选项对您的情况也有帮助。