【问题标题】:Obtain the latest refspec on a Gerrit Change获取 Gerrit 更改的最新 refspec
【发布时间】:2014-04-11 10:52:06
【问题描述】:

如何通过单个命令获取有关 gerrit 更改的最新 refspec。 我需要输出为“refs/changes/11/1234/4”。有没有相同的git命令

我知道 ssh 命令结合 gerrit 查询和一些脚本可以实现这一点,但想知道是否有更好的方法来做同样的事情。以下是我用来获取 refspec 的 ssh 命令。

ssh -p $REVIEW_SERVER_PORT $GERRIT_REVIEW_SERVER gerrit 查询 --format=TEXT --current-patch-set $CHANGE_SHA | grep 参考。

同样,我也想获得 gerrit 更改的最新补丁集

【问题讨论】:

  • 你找到答案了吗?我也在寻找这样的东西。

标签: git ssh gerrit refspec


【解决方案1】:

这是一个避免列出远程或使用 gerrit REST API 的解决方案。

gerrit 中的每个更改都有一个特殊的引用,称为meta

git fetch origin refs/changes/98/898/meta

一旦被获取,它就会指向一个提交链,这些提交链代表了此更改的更新历史。除其他外,提交消息有一个预告片Patch-set,其中将包含此更改适用的补丁集编号:

> git log FETCH_HEAD

Author: Gerrit User 1000026 <1000026@dc17d2f6-4abc-4304-ba32-8b7ca44eda6b>
Date:   Wed Aug 19 06:36:23 2020 +0100

Update patch set 6

Change has been successfully cherry-picked as 68e4bc1612d61110ccfae4ac94bbd4458b2868a9 by Leonid Usov

Patch-set: 6
Subject: Add a new feature
Status: merged
Commit: 68e4bc1612d61110ccfae4ac94bbd4458b2868a9
Tag: autogenerated:gerrit:merged
Groups: bd9a33f7432c39308935056720de59168ff04003
Label: Code-Review=+2
Label: Verified=+1 Gerrit User 1000001 <1000001@dc17d2f6-4abc-4304-ba32-8b7ca44eda6b>
Label: SUBM=+1
Submission-id: 914
Submitted-with: OK
Submitted-with: OK: Code-Review: Gerrit User 1000026 <1000026@dc17d2f6-4abc-4304-ba32-8b7ca44eda6b>
Submitted-with: OK: Verified: Gerrit User 1000001 <1000001@dc17d2f6-4abc-4304-ba32-8b7ca44eda6b>

当然,该分支的尖端将指向最新更新,因此将包含最新补丁集的编号。以下是我如何知道更改的最新补丁集编号的方法:

 » git fetch origin refs/changes/14/914/meta \
   && git cat-file -p FETCH_HEAD \
    | git interpret-trailers --parse \
    | sed -E "/^Patch-set:/s/([[:alpha:]-]+):[[:space:]]*(.*)/\2/;q"
From ssh://gerrit/repo
 * branch                    refs/changes/14/914/meta -> FETCH_HEAD
6

请随意在标准输出上使用 6 ;)

【讨论】:

    【解决方案2】:

    这是一个可以通过 HTTP 运行的解决方案,因为 SSH 在某些 CI 环境中可能无法运行。

    find_latest_change () {
      local remote=$1
      local review=$2
      git ls-remote $remote | grep -E "refs/changes/[[:digit:]]+/$2/" | sort -t / -k 5 -g | tail -n1 | awk '{print $2}'
    }
    
    remote=https://review.gerrithub.io/org-name/project-name
    latest=$(find_latest_change $remote 12345)
    git fetch $remote $latest && git cherry-pick FETCH_HEAD
    

    【讨论】:

      【解决方案3】:

      您应该使用gerrit query。给定更改编号4665

      ssh -p 29418 review.example.com gerrit query --current-patch-set --format=JSON change:4665
      

      哪些输出:

      {  
         "project":"xx",
         "branch":"master",
         "topic":"TOPIC",
         "id":"I0b6fc492fd08749e409c359a73d74e7795f50cc9",
         "number":"4665",
         // ...
         "currentPatchSet":{  
            "number":"5",
            "revision":"ae3a5d2684991070041e1c34b5a16b1376dc3ce5",
            "parents":[  
               "5b21793cadd3dc55008ef6c8dc658e127d80c097"
            ],
            "ref":"refs/changes/65/4665/5",
            // ...
         }
      }
      

      您可以在哪里找到 currentPatchSet.ref 字段。


      旧的、过于复杂的解决方案:

      前提是你想获取最新的补丁集变更2392

      git ls-remote | grep /2392/ | awk '{print $2}' | sed 's/\// /g' | sort -n -k5 | tail -n 1 | sed 's/ /\//g'
      

      为我的仓库输出refs/changes/92/2392/12

      或者,当您想从 Gerrit 获取最后一个更改时:

      git ls-remote | awk '{print $2}' | sed 's/\// /g' | sort -n -k4 | tail -n 1 | sed 's/ /\//g'
      

      为我的仓库输出refs/changes/54/2554/2


      说明

      git ls-remote 命令显示远程存储库中的所有引用,因此对于 Gerrit - 每个补丁集也会列出。它输出类似:

      2ccddbfb34a98e8ba461964fae3766aa41be944d        refs/changes/91/2291/7
      d00c21c28d07626caea27594489442696ea39231        refs/changes/91/2291/8
      8c05e6551a6a34c33a36669bf7e83c996569e24d        refs/changes/91/2291/9
      bc6762ac7b9ac5a74fc2e548df2541cb83977ec5        refs/changes/91/2391/1
      3bd96c0d1ba2d561fa484ddfc264fabbf86aa536        refs/changes/91/2391/2
      

      因此,为了从特定更改中选择所有补丁集,我们需要通过/NUMBER/ grep 结果,这解释了grep /2392/。之后,通过选择带有awk 的第二列,结果是:

      refs/changes/92/2392/1
      refs/changes/92/2392/10
      refs/changes/92/2392/11
      refs/changes/92/2392/12
      refs/changes/92/2392/2
      refs/changes/92/2392/3
      refs/changes/92/2392/4
      refs/changes/92/2392/5
      refs/changes/92/2392/6
      refs/changes/92/2392/7
      refs/changes/92/2392/8
      refs/changes/92/2392/9
      

      现在我们要选择最后一个补丁集。我们需要排序。 sort 命令可以使用 -n 按数字排序,我们可以使用 -kX 参数指定在哪一列上执行排序。但它需要用空格分隔列(AFAIK),所以我们需要用空格替换我们的/ 分隔符。我们使用sed。第一次替换后,每个refs/changes/92/2392/X 变为refs changes 92 2392 X。然后对第五列(补丁集编号)执行排序。结果:

      refs changes 92 2392 1
      refs changes 92 2392 2
      refs changes 92 2392 3
      refs changes 92 2392 4
      refs changes 92 2392 5
      refs changes 92 2392 6
      refs changes 92 2392 7
      refs changes 92 2392 8
      refs changes 92 2392 9
      refs changes 92 2392 10
      refs changes 92 2392 11
      refs changes 92 2392 12
      

      最后要做的是用tail 选择最后一行并将空格替换为斜杠。瞧!

      以相同的方式从 Gerrit 中选择最新更改,但没有 grep 和按第四列 (Change-Id) 排序。

      【讨论】:

      • 曾经可以将sed 's/\// /g' | sort -n -k5 | tail -n 1 | sed 's/ /\//g'替换为sort -t'/' -k5rn | head -1
      • 添加 | jq '.currentPatchSet.ref' 会使这个答案更有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多