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

时间:2015-02-06 16:40:46

标签: 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

拉出裁判:

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

这将创建一个Git提交点,您最终可以重新设置:

git rebase

4 个答案:

答案 0 :(得分:58)

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

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

Gerrit Change Screen Download

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

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

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

git checkout -b b64403-2

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

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

如果您没有看到将选项下载到CheckoutCherry Pick的选项,则需要修改gerrit.config,如下所示:

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

更多详情可在Gerrit Documentation

中找到

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

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

答案 1 :(得分:40)

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

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

git review -d 148486

或者您可以使用更改ID:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

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

git review -d 148486,2

答案 2 :(得分:6)

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

对于您的情况,也许自动下载所有参考文件有助于您直接参考它们。您可以随时使用git fetch origin "+refs/changes/*:refs/remotes/origin/changes/*"指定ref。然后,您可以使用提交ID在本地工作。

可以轻松完成一个简单的git别名或为所有引用编写脚本。这个while循环的一个例子可以在https://github.com/saper/gerrit-fetch-all的脚本中找到。有了这么小的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

答案 3 :(得分: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 -

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'`