Git 获取Gerrit变更的最新参考规范

Git 获取Gerrit变更的最新参考规范,git,ssh,gerrit,refspec,Git,Ssh,Gerrit,Refspec,如何通过单个命令获得gerrit更改的最新REFSECE。 我需要输出为“refs/changes/11/1234/4”。是否有任何git命令用于相同的操作 我知道ssh命令结合gerrit query和一些脚本可以实现这一点,但我想知道是否有更好的方法来实现这一点。下面是我用来获取refspec的ssh命令 ssh-p$REVIEW\u SERVER\u PORT$GERRIT\u REVIEW\u SERVER GERRIT query--format=TEXT--current patch

如何通过单个命令获得gerrit更改的最新REFSECE。 我需要输出为“refs/changes/11/1234/4”。是否有任何git命令用于相同的操作

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

ssh-p$REVIEW\u SERVER\u PORT$GERRIT\u REVIEW\u SERVER GERRIT query--format=TEXT--current patch set$CHANGE\u SHA | grep ref

同样,我还想获得gerrit更改的最新补丁集,您应该使用。给定变更编号
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


解释

命令显示远程存储库中的所有引用,所以在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/
。之后,通过选择第二列,结果为:

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
现在我们要选择最后一个补丁集。我们需要分类。命令可以使用
-n
按数字排序,我们可以使用
-kX
参数指定要对哪个列执行排序。但是它需要用空格(AFAIK)分隔列,因此我们需要用空格替换分隔符
/
。我们用它。首次更换后,每个
refs/changes/92/2392/X
变为
refs changes 92 2392 X
。然后对第五列(补丁集编号)执行排序。结果:

最后要做的是选择最后一行,并将空格替换回斜杠。瞧


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

这里有一个可以通过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

这里有一个解决方案,可以避免列出远程应用程序或使用GerritRESTAPI

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

git fetch origin refs/changes/98/898/meta
获取后,它将指向一系列提交,这些提交表示此更改的更新历史。除其他外,提交消息有一个拖车
补丁集
,其中将包含此更改适用的补丁集编号:

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

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

你找到答案了吗?我也在寻找类似的东西。Once可以用
sort-t'/'-k5rn-head-1
替换
sed's/\///g'| sort-n-k5 | tail-n1 | sed's/\///g'
,添加
| jq“。currentPatchSet.ref
将使这个答案更有用。
> 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