如何通过单个命令获取gerrit更改的最新refspec。我需要输出为"refs/changes/11/1234/4“。有没有什么git命令可以做到这一点
我确实知道ssh命令结合gerrit查询和一些脚本可以实现这一点,但我想知道是否有更好的方法来实现同样的目的。下面是我用来获取refspec的ssh命令。
ssh -p $REVIEW_SERVER_PORT $GERRIT_REVIEW_SERVER gerrit查询--format=TEXT --当前修补程序集$CHANGE_SHA | grep ref。
类似地,我还希望获得gerrit更改的最新PATCHSET
发布于 2014-09-27 06:17:00
您应该使用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
字段。
旧的、过于复杂的解决方案:
假设您想要获得最新的change 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
参数指定对哪一列执行排序。但是它需要用空格分隔列,所以我们需要用空格替换/
分隔符。我们使用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)。
发布于 2016-12-02 20:11:58
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
发布于 2020-08-19 15:00:18
这是一个避免列出遥控器或使用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
;)
https://stackoverflow.com/questions/22264533
复制相似问题