Gerrit:如何向已经存在于Gerrit上的提交请求代码审查

3

我的工作场所开始使用Gerrit来管理我们所有的项目。我以前从未使用过Gerrit。我正在尝试找到一个良好的工作流来使用它提交代码进行审查。

我创建了一个名为foo的分支。我在它上面做了一个提交,并将其推送到Gerrit。然后,我开启了一个从foo开始的bar分支,并在其上进行了另一个提交。我也将bar分支推送到了Gerrit。

现在我在bar分支上:

$ git branch
* bar
foo

现在我想对从bar合并到foo的代码进行审查。有人告诉我这个命令可以实现:

$ git push gerrit HEAD:refs/for/foo
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Processing changes: refs: 1, done
To ssh://ram@gerrit/acme/my_project
 ! [remote rejected] HEAD -> refs/for/foo (no new changes)
error: failed to push some refs to 'ssh://ram@gerrit/acme/my_project' 

正如你所看到的,我遇到了错误(没有新更改)。我问我们当地的Gerrit专家是为什么,他说据他所知,即使该代码在不同的分支上,也不能将已经在Gerrit上的代码推送进行代码审查。
看起来如果我不将分支bar推送到Gerrit上,我的问题就会消失,代码审查也会起作用。但我更喜欢能够随意推送任何内容而不会影响代码审查。我喜欢推送分支。我喜欢把我的分支放在Gerrit上,这样我也可以将它们发送给其他人在Web界面上查看。
是否有可能使Gerrit中的代码审查工作,而不禁止我将我的分支推送到Gerrit上呢?

我想到的一个解决方法是修改您的提交,删除更改ID(以便您的钩子创建一个新的更改ID),然后再次尝试推送。如果可以,请告诉我。 - Dunno
@Dunno 感谢您的创意,但我正在寻找一个好的工作流程,那个解决方法对我来说太过于hacky了。如果找不到更好的解决方案,我宁愿有一个单独的远程推送。 - Ram Rachum
1
事情是这样的,对于Gerrit来说,change-id基本上就像Git中的commit id一样重要。一旦你提交了一个带有一个change-id的commit,除非它被修改,否则你不能再次提交它。我怀疑是否有一种非常规的解决方案,但我会尽力找到一个。顺便说一下,我的变通方法有效,我亲自测试过了。 - Dunno
@Dunno是正确的,解决方案不是一个hacky workaround,这是关于Gerrit流程的:您不能拥有具有相同Change-Id的2个不同更改。您只需要更改Change-Id即可。 - Marcelo Ávila de Oliveira
据我所知,您必须修改合并提交以使git添加一个新的change-id。 gerrit钩子的默认行为是不将change-id添加到git合并中。 如果我理解正确,您的合并提交尚未推送到gerrit,但您希望这样做吗? 您是否可以将“bar”变基到“foo”而不是进行合并? 如果可以的话,我将在答复中解释它。 - Flows
foo 的所有更改都已提交了吗?根据你描述的,预计应该是一个快进推送。但是它失败了。 - ElpieKay
3个回答

0

Gerrit不允许您使用相同的change-id两次推送相同的提交。这留给您两个选择:

  1. 修改现有提交以更改change-id
  2. 创建一个新的提交,它将具有不同的change-id,并包含来自foo分支的所有更改。

无论哪种方式,您都必须更改提交的change-id,在选项1中使用git commit --amend或在选项2中使用git rebase foo bar -i,将所有提交压缩为1,然后更改其消息。

实际上,这是一个合理的行为-Gerrit是一个代码审查工具,因此直接将提交推送到分支没有意义。

如果您真的需要一个远程仓库只是为了向他人展示您的代码,则必须为此目的创建一个新的远程仓库。


这实际上是一种合理的行为 - Gerrit 是一个代码审查工具,因此直接向分支推送提交是没有意义的。如果 Gerrit 没有为您处理合并,那么您的论点可能是有道理的。但是 Gerrit 的工作方式意味着所有合并最终都将通过 Gerrit 进行,因此您应该有选择以合理的方式进行操作。 - Steven Byks
如果你真的需要一个远程工具来展示你的代码给别人看,那么你就必须为此制作一个新的工具。你基本上是在说,“不要使用Gerrit进行代码审查”。向他人展示你的代码是代码审查的主要内容之一。如果你不能通过Gerrit做到这一点,那么它作为一个代码审查工具就有点无用了。 - Steven Byks

0

我认为你需要以不同的方式进行合并
- 首先,在本地合并分支 - git checkout foo 然后 git merge origin/bar
- 其次,将本地foo的合并提交推送到远程foo - git push gerrit HEAD:refs/for/foo

别忘了在合并提交中放入 changeId

通常情况下,没有必要对提交进行两次审查。相反,您需要审查合并提交或rebase方法。如果您的分支不是特定的分支,例如dev vs. release,请考虑使用rebase。


我也考虑过这个,但是行不通。首先,如果 bar 可以快进到 foo,合并操作甚至不会起作用;而且如果你尝试使用 --no-ff 选项将 bar 合并到 foo,创建的提交记录将是空的。 - Dunno

0

在合并代码时,Git不会添加更改标识。您需要修改合并提交以添加新的更改标识。

这将允许您将合并提交推送到Gerrit。 Gerrit挂钩的默认行为是不向 Git 合并添加更改标识。

我建议的另一种解决方案是使用变基而不是合并。您可以使用git rebase foo从分支bar 将 bar 变基到 foo。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接