Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git Gerrit:推动代码审查,提交';他已经在Gerrit身上了_Git_Gerrit - Fatal编程技术网

Git Gerrit:推动代码审查,提交';他已经在Gerrit身上了

Git Gerrit:推动代码审查,提交';他已经在Gerrit身上了,git,gerrit,Git,Gerrit,我的工作场所开始使用Gerrit来管理我们所有的项目。我以前从未用过Gerrit。我正试图找出一个好的工作流程,用它来提交代码以供审查 我创建了一个分支foo。我对它作出了承诺,并把它推给了Gerrit。然后我从foo开始了一个分支bar,并对其进行了另一次提交。我也将分支条推给了Gerrit 我现在在分行栏上: $ git branch * bar foo 现在,我想开始一个代码检查,以便从bar合并到foo。我被告知该命令应执行以下操作: $ git push gerrit HEAD:re

我的工作场所开始使用Gerrit来管理我们所有的项目。我以前从未用过Gerrit。我正试图找出一个好的工作流程,用它来提交代码以供审查

我创建了一个分支
foo
。我对它作出了承诺,并把它推给了Gerrit。然后我从
foo
开始了一个分支
bar
,并对其进行了另一次提交。我也将分支
推给了Gerrit

我现在在分行
栏上

$ 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 champion为什么,他说据他所知,你不能推动Gerrit上已经存在的代码审查代码,即使这些代码在不同的分支上

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


是否可以在不禁止我将分支推送到Gerrit的情况下,让Gerrit中的代码检查正常工作?Gerrit将不允许您两次推送具有相同更改id的相同提交。这就给您留下了两个选择:

  • 修改现有提交以更改更改id
  • 创建一个新的提交,该提交将具有不同的更改id,并包含来自分支foo的所有更改
  • 无论哪种方式,您都必须更改提交的更改id,在选项1中使用
    git commit--amend
    ,或者在选项2中使用
    git rebase foo bar-i
    ,将所有提交压缩为1,然后更改其消息


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


    如果你真的需要一个遥控器来向其他人显示你的代码,那么你必须为此目的制作一个新的。

    我认为你需要以不同的方式进行合并
    -首先,本地合并分支-
    git checkout foo
    然后
    git merge origin/bar

    -其次,将合并提交从本地foo推送到远程foo-
    git-push-gerrit-HEAD:refs/for/foo

    别忘了输入合并提交


    一般来说,没有必要对提交进行两次审查。Isntead您需要查看合并提交或重新设置方法。考虑使用ReBASE,如果你的分支不是特定的,比如DEV与发行版

    < P>当合并时,Git不添加一个转换ID。你必须“强”修改合并提交< /强>使Git添加一个新的转换ID。< /P> 这将允许您将合并提交推送到gerrit。 gerrit hook的默认行为是不向git合并添加更改id


    我建议的另一个解决方案是做一个重基,而不是合并。您可以使用branch
    bar

    中的
    git-rebase-foo
    将bar重设到foo上。我想到的一个解决方法是:取消提交,删除更改id(以便钩子创建一个新id),然后再次尝试推送。如果有,请告诉我works@Dunno谢谢你的创意,但我正在寻找一个好的工作流程,而且这种解决方法对我来说太粗糙了。(如果找不到更好的解决方案,我宁愿使用一个单独的遥控器。)问题是,将ID更改为gerrit基本上就是将ID提交到git。一旦使用一个更改id推送提交,除非它已更改,否则无法再次推送。我怀疑是否有一个非黑客的解决方案,但我会努力找到一个。顺便说一句,我的变通方法有效,我只是自己检查了一下。@Dunno是对的,解决方案不是一个黑客的变通方法,这是关于Gerrit流程的:你不能用同一个Change-Id进行两个不同的更改。你只需要更改Change-Id。据我所知,您必须修改合并提交以使git添加新的变更id。gerrit hook的默认行为是不向git合并添加变更id。如果我理解的很好,您的合并提交尚未推送到gerrit,但您愿意吗?您是否可以将
    bar
    重设为
    foo
    而不是合并?如果是的话,我会在回答中解释。我也想过这个,但它不起作用。首先,如果
    bar
    可以快速转发到
    foo
    ,merge甚至不会做任何事情,如果您尝试使用
    --no ff
    选项将
    bar
    合并到
    foo
    ,则创建的提交将为空。“这实际上是一个合理的行为-Gerrit是一个代码审查工具,因此直接将提交推送到分支是没有意义的。”-如果Gerrit没有为您处理合并,您的论点可能有意义。但Gerrit的工作方式意味着所有合并最终都要经过Gerrit,因此您应该有选择理智地进行。”如果你真的需要一个遥控器来向其他人展示你的代码,那么你就必须为这个目的制作一个新的遥控器。“你基本上只是说,“不要使用gerrit进行代码审查”。向其他人展示你的代码是代码审查的主要内容。如果你不能用gerrit这样做,那么它作为代码审查工具就没用了。