【问题标题】:How to git-pull a given patch set from Gerrit?如何从 Gerrit git-pull 给定的补丁集?
【发布时间】:2015-02-06 16:40:45
【问题描述】:

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

虽然上述步骤非常简单并且可以满足我的需求,但在最好的情况下,我希望补丁集在我的本地 Git 中显示为提交。

我环顾四周,没有找到解决方案。我发现一些稀疏信息一旦编译在一起就会给出以下解决方案。

说要拉取Gerrit change 1222的patch set 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

【问题讨论】:

  • 您是否有任何理由不使用 Gerrit UI 中提供的标准 download 选项?
  • 原因是如果有一个待处理的代码审查(由其他人完成),因为我需要在它之上进行更改,所以拉取补丁集更方便的。它允许我在前一个提交点仍在审核中时立即提交我的代码更改。
  • 没错,这就是您使用这些下载选项的目的。请阅读文档,您会明白的。
  • FWIW 比较不易出错的 refs 匹配方法是 git ls-remote origin 'refs/changes/*/1220/*'

标签: git gerrit


【解决方案1】:

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

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

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

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

【讨论】:

  • 有趣。我没有“下载”下的“结帐”和“樱桃挑选”选项。我只有“补丁文件”和“存档”。也许一些 Gerrit 管理选项可以让“结帐”和“樱桃挑选”出现?或者可能需要更新到较新版本的 Gerrit?
  • 添加了相关的 gerrit.config 部分示例。
  • 谢谢,我在 UI 中完全错过了这一点,并且花了一些时间寻找这样一个简单的答案。
  • 在配置下载插件无济于事后,我曾多次重启我的 Gerrit 服务器。原来,download-commands.jar 不见了。从war文件中复制丢失的jar后,这些链接终于出现了。我不确定是不是因为我的服务器之前是从 2.x 升级的。无论如何,以防万一有人遇到这个问题,您可以参考gerrit-documentation.storage.googleapis.com/ReleaseNotes/…了解更多详情。
【解决方案2】:

或者您可以将-d 选项用于git-review。例如,假设您正在使用 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 在哪里。请手动创建一个名为“gerrit”的遥控器,然后重试。
  • 啊,我认为既然你在使用 gerrit,你已经在使用 git-review.gitreview 文件类似于 this
  • git review -s 应该设置这个文件。
  • @volker,您首先需要 .gitreview 文件(否则,git review -s 不知道您的 gerrit 遥控器在哪里......)。如果您在没有.gitreview 文件的情况下尝试此操作,您会得到“在此存储库中找不到“.gitreview”文件。我们不知道您的 gerrit 在哪里。请手动创建一个名为“gerrit”的远程并重试。”
  • 请注意,根据 gerrit repo 本身的版本,您可能必须确保 git-review 为 1.27+(请参阅 phabricator.wikimedia.org/T194520#5446026
【解决方案3】:

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

对于您的情况,自动下载所有 ref 以便您可以直接引用它们可能会有所帮助。你总是可以使用

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

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

一个简单的 git 别名或为所有 ref 编写脚本都可以轻松完成。可以在https://github.com/saper/gerrit-fetch-all 上的脚本中找到此类 while 循环的示例。有了这么小的 shell sn-p,您可以轻松完成跳过 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。
  • 对于只想使用git 获取所有更改而无需安装或配置任何特定gerrit 工具的我们来说,这是正确的答案。
【解决方案4】:

正如 cmets 中所述,您可以从 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'`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2013-04-13
    • 2017-04-30
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多