【问题标题】:Gerrit: Pushing for code review a commit that's already on GerritGerrit:推动代码审查一个已经在 Gerrit 上的提交
【发布时间】:2016-09-01 15:44:22
【问题描述】:

我的工作场所开始使用 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' 

如您所见,我收到了错误 (no new changes)。我问我们当地的 Gerrit 拥护者为什么,他说据他所知,你不能推送已经在 Gerrit 上的代码审查代码,即使该代码在不同的分支上。

看起来如果我避免将分支 bar 推送给 Gerrit,我的问题就会消失,代码审查也会起作用。 但我希望能够推送任何我想要的 %&@# 而不会干扰代码审查。我喜欢推送分支。我喜欢在 Gerrit 上拥有我的分支机构,因为这样我也可以将它们发送给其他人以在 Web 界面上查看。

是否可以在不禁止我将分支推送到 Gerrit 的情况下在 Gerrit 中进行代码审查?

【问题讨论】:

  • 我想到的一种解决方法是修改您的提交,删除更改 ID(以便您的挂钩创建一个新的)并再次尝试推送。让我知道这是否有效
  • @Dunno 感谢您的创意,但我正在寻找一个好的工作流程,而这种解决方法对我来说太老套了。 (如果找不到更好的解决方案,我宁愿使用单独的遥控器。)
  • 问题是,gerrit 的 change-id 基本上就是 git 的提交 id。一旦你推送了一个带有一个更改 ID 的提交,除非它被更改,否则你不能再次推送它。我怀疑有一个非hacky的解决方案,但我会尝试找到一个。顺便说一句,我的解决方法有效,我自己检查了一下。
  • @Dunno 是对的,解决方案不是一个 hacky 解决方法,这是关于 Gerrit 过程:您不能使用相同的 Change-Id 进行 2 个不同的更改。您只需要更改 Change-Id。
  • 据我所知,您必须修改合并提交以使 git 添加新的更改 ID。 gerrit 钩子的默认行为是不向 git 合并添加更改 ID。如果我理解得很好,您的合并提交尚未推送到 gerrit,但您想要吗?您是否可以将bar rebase foo 而不是合并?如果是,我会在答案中解释。

标签: git gerrit


【解决方案1】:

我认为您需要以不同的方式进行合并
- 首先,在本地合并分支 - 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,则创建的提交将为空。
【解决方案2】:

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

  1. 修改现有提交以更改更改 ID
  2. 创建一个具有不同更改 ID 的新提交,并包含分支 foo 中的所有更改。

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

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

如果您真的需要一个遥控器只是为了向其他人展示您的代码,那么您必须为此制作一个新的。

【讨论】:

  • “这其实是一种合理的行为——Gerrit 是一个代码审查工具,所以直接将提交推送到分支是没有意义的。” - 如果 Gerrit 没有为您处理合并,那么您的论点可能是有道理的。但是 Gerrit 的工作方式意味着所有的合并最终都要经过 Gerrit,所以你应该可以选择明智地进行。
  • “如果你真的需要一个遥控器只是为了向其他人展示你的代码,那么你必须为此制作一个新的。”您基本上只是说,“不要使用 gerrit 进行代码审查”。向其他人展示您的代码是代码审查的大部分内容。如果你不能用 Gerrit 做到这一点,那么它作为代码审查工具有点没用。
【解决方案3】:

在进行合并时,git 不会添加 change-Id。您必须修改合并提交以使 git 添加新的更改 ID。

这将允许您推送 gerrit 合并提交。 gerrit hook 的默认行为是不向 git 合并添加 change-id。

我推荐的另一种解决方案是进行变基而不是合并。您可以使用来自分支 bar 的 git rebase foo 将 bar 重新设置为 foo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2012-08-14
    • 2017-04-30
    相关资源
    最近更新 更多