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


75

使用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

拉裁判:

git pull origin refs/changes/20/1220/2

这将创建一个Git提交点,您最终可以将其变基:

git rebase

1
有什么理由为什么不使用Gerrit UI中提供的标准下载选项?
uncletall'2

原因是,如果我要获得待处理的代码审查(由他人进行),因为我需要在上面进行更改,则提取补丁集会更加方便。它使我可以在上一个提交点仍在审核时立即提交我的代码更改。
Herve Thu 2015年

确实,这就是您使用这些下载选项的目的。请阅读文档,您将了解。
uncletall

2
FWIW对ref进行匹配的错误较少的方法是git ls-remote origin 'refs/changes/*/1220/*'
Tgr

Answers:


74

此功能在Gerrit UI中是标准的。

在补丁程序用户界面的右上角,单击下载,您将看到类似以下内容:

Gerrit更改屏幕下载

浏览补丁程序时,请转到下载部分,然后复制命令行命令以签出补丁程序集,例如:

git fetch https://gerrit.googlesource.com/gerrit refs/changes/03/64403/2 && git checkout FETCH_HEAD

然后我通常以评论编号和补丁集为名称创建一个分支

git checkout -b b64403-2

在这里,您可以正常工作并提交更改,或基于此更改选择/恢复更改。

一旦完成r64403的审查,您的代码就可以合并,或者当提交另一个补丁集时,您将需要再次执行相同的操作。

如果看不到将选项下载到的选项,Checkout或者Cherry Pick您需要编辑gerrit.config,则如下所示:

[download]
    scheme = ssh
    command = checkout
    command = cherry_pick

更多细节可以在Gerrit文档中找到


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

java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands

有趣。我在“下载”下没有“结帐”和“樱桃挑选”选项。我只有“补丁文件”和“存档”。也许有一些Gerrit管理员选项可以启用“结帐”和“樱桃领取”的显示?还是需要更新到Gerrit的最新版本?
2015年

2
添加了相关的gerrit.config部分示例。
uncletall

1
谢谢,我在UI中完全错过了它,并且花了一些时间才能找到这样的简单答案。
SpoonMeiser

2
配置下载插件无济于事后,我多次重启了Gerrit服务器。原来,缺少download-commands.jar。从war文件中复制丢失的jar后,这些链接最终显示出来。我不确定是否是因为我的服务器是从2.x之前升级的。无论如何,以防万一有人遇到此问题,您可以参考gerrit-documentation.storage.googleapis.com/ReleaseNotes/…了解更多详细信息。
barryku

48

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

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

git review -d 148486

或者,您可以使用更改ID:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

您还可以通过添加逗号和补丁号来请求补丁的特定版本。例如,要获取该补丁的第二个版本:

git review -d 148486,2

感谢您的提示,但由于出现错误(如下所示),我似乎需要进一步设置才能使用git review。$ git review -d I85be47d597611508f5dd9360145bbe2f67cb2148在此存储库中找不到“ .gitreview”文件。我们不知道您的语言。请手动创建一个名为“ gerrit”的遥控器,然后重试。
Herve Thu 2015年

啊,我想既然您正在使用gerrit,就已经在使用git-review。一个.gitreview文件看起来像这样
larsks,2015年

1
git review -s应该设置这个文件。
Volker

1
@volker,您.gitreview首先需要文件(否则,git review -s不知道gerrit远程文件在哪里...)。如果尝试不使用.gitreview文件进行操作,则会收到“在此存储库中找不到“ .gitreview”文件。我们不知道您的Gerrit在哪里。请手动创建一个名为“ gerrit”的远程文件,然后重试。”
larsks,2015年

请注意,根据的格里特回购本身的版本则可能必须确保git-review是1.27+(见phabricator.wikimedia.org/T194520#5446026
Lokal_Profil

10

我不确定100%是您的问题。听起来您想简化工作流程或输入。提到过的幼虫git review是最常用的。

对于您的情况,也许可以自动下载所有参考文件,以便直接参考它们。您可以始终将所有指定的引用与

git fetch origin "+refs/changes/*:refs/remotes/origin/changes/*" 

然后,您可以使用提交ID在本地工作

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

    Server side:                 Client side:
    refs/changes/13/713/1        refs/head/713/1
    refs/changes/20/1220/1       refs/head/1220/1
    refs/changes/20/1220/2       refs/head/1220/2
    refs/changes/22/1222/1       refs/head/1222/1

问题是关于如何从Gerrit中提取补丁集,我也通过分享我的工作方式来回答这个问题。在写出我的问题之前从未使用过git-review。
2015年

2
对于只想git获取所有更改,而不必安装或配置任何特定Gerrit工具的人来说,这是正确的答案。
雨果·约瑟夫森

6

如评论中所述,您可以从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 -

要么

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'`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.