如何从Gerrit git-pull给定的补丁集?

Her*_*Thu 62 git gerrit

在使用Gerrit(代码审查)时,我经常需要获取给定补丁集的副本以用于测试或验证目的.显而易见且最简单的方法是通过Gerrit Web界面下载存档或补丁文件,并手动将其应用到我的本地源.

虽然上述步骤非常简单并且满足了我的需求,但在最好的世界中,我希望将补丁集作为我本地Git中的提交出现.

我环顾四周,没有找到解决方案.我发现一些编译在一起的稀疏信息提供了以下解决方案.

假设您想要拉出Gerrit更改1222的补丁集2:

找到我们感兴趣的远程参考:

$ git ls-remote | grep 1220
From http://something.com:8081/MyProject
e2e0212a59240ac5cd7c11220c35542523f44b59        refs/changes/13/713/1
b8c4dceea5eaf1bad711b0ea6938c80ec932726a        refs/changes/20/1220/1
6f20c182ec7f54a2aa9e8f6188a0eef1b0790df4        refs/changes/20/1220/2
ed94a98386d224ce3d86004ce99f61220905a077        refs/changes/22/1222/1
Run Code Online (Sandbox Code Playgroud)

拉参考:

git pull origin refs/changes/20/1220/2
Run Code Online (Sandbox Code Playgroud)

这将创建一个Git提交点,您最终可以进行rebase:

git rebase
Run Code Online (Sandbox Code Playgroud)

unc*_*all 66

此功能是Gerrit UI中的标准功能.

在修补程序的UI右上角,单击"下载",您将看到如下内容:

Gerrit更改屏幕下载

当您导航补丁时,您将转到下载部分并复制命令行命令以检出补丁集,例如:

git fetch https://gerrit.googlesource.com/gerrit refs/changes/03/64403/2 && git checkout FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

然后我通常创建一个分支,其中包含评论编号和补丁集作为名称

git checkout -b b64403-2
Run Code Online (Sandbox Code Playgroud)

在这里,您可以正常工作并提交您的更改,或者根据此更改挑选/修改您的更改.

完成对r64403的审核后,您的代码可以合并,或者当提交另一个补丁集时,您需要再次执行相同的操作.

如果您没有看到下载选项的选项,Checkout或者Cherry Pick您需要编辑gerrit.config,请执行以下操作:

[download]
    scheme = ssh
    command = checkout
    command = cherry_pick
Run Code Online (Sandbox Code Playgroud)

更多详细信息可以在Gerrit文档中找到


更新:正如barryku正确指出的那样,在更高版本中,您需要下载downloads-commands插件.这可以在初始设置期间或使用以下命令完成:

java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands
Run Code Online (Sandbox Code Playgroud)

  • 添加了相关的gerrit.config部分示例. (2认同)
  • 配置下载插件后,我多次重启Gerrit服务器无济于事.事实证明,缺少download-commands.jar.从war文件中复制丢失的jar后,最终会显示这些链接.我不确定是不是因为我的服务器之前从2.x升级过.无论如何,如果有人遇到此问题,您可以参考https://gerrit-documentation.storage.googleapis.com/ReleaseNotes/ReleaseNotes-2.9.html#_important_notes了解更多详情. (2认同)

lar*_*sks 42

或者你可以使用-d选项git-review.例如,假设您正在使用nova- docker存储库并且对gerrit的这种更改感兴趣:

您可以下载最新的补丁集:

git review -d 148486
Run Code Online (Sandbox Code Playgroud)

或者您可以使用更改ID:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb
Run Code Online (Sandbox Code Playgroud)

您还可以通过附加逗号和修补程序编号来请求修补程序的特定修订版.例如,要获得该补丁的第二个修订版:

git review -d 148486,2
Run Code Online (Sandbox Code Playgroud)


小智 8

我不是100%确定你的问题是什么.听起来你想要简化工作流程或打字.larsks已经提到了git review大部分使用的.

对于您的情况,也许有助于自动下载所有参考,以便您可以直接参考它们.你可以随时指定所有指定的ref git review.然后,您可以使用提交ID在本地工作.

可以轻松完成一个简单的git别名或为所有引用编写脚本.这个while循环的一个例子可以在https://github.com/saper/gerrit-fetch-all上的脚本中找到. 有了这么小的shell片段,您可以轻松完成跳过ref id的一部分以便于参考他们:

git fetch origin "+refs/changes/*:refs/remotes/origin/changes/*" 
Run Code Online (Sandbox Code Playgroud)

  • 对于我们只想使用`git`来获取所有更改,而不必安装或配置任何特定的gerrit工具,这是正确的答案. (2认同)

Tgr*_*Tgr 5

正如评论中所提到的,您可以从gerrit GUI获得正确的git命令.如果您真的不喜欢GUI,或者您想自动化它(并且由于某种原因无法使用git-review),您可以使用gerrit API:

curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION&o=DOWNLOAD_COMMANDS' | tail -n+2 | jq -r '.revisions[.current_revision].fetch["anonymous http"].commands.Pull' | bash -
Run Code Online (Sandbox Code Playgroud)

要么

git pull origin `curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION' | tail -n+2 | jq -r '.revisions[.current_revision].ref'`
Run Code Online (Sandbox Code Playgroud)