如何始终从 gerrit 中挑选最新版本的评论?
How to always cherry pick the latest version of a review from gerrit?
是否有一种可编写脚本的方式来挑选最新版本的 gerrit 补丁审查?
在 Gerrit 界面上,您可以轻松复制 cherry pick 的代码,但此代码指定了特定版本,我对某些 bash 代码感兴趣,这些代码会选择最新版本而不是特定版本。
git fetch https://review.gerrithub.io/org-name/project-name refs/changes/02/12345/5 && git cherry-pick FETCH_HEAD
如您所见,这将选择版本 5。
更新
git review -s
git review -x 123456
我在本地尝试了 review -x 方法,它起作用了,但是 运行 Jenkins 的一些方法失败了:
Could not connect to gerrit.
Enter your gerrit username: <traceback object at 0x285ecf8>
We don't know where your gerrit is. Please manually create a remote
named "gerrit" and try again.
git-review 工具让这一切变得非常简单。它使用 gerrit API 查找可用于给定评论的最新变更集。
例如,您可以 运行...
git review -x 12345
...将指定更改的最新版本挑选到您的本地分支中。还有一个 -d
选项,它将更改公开为一个新分支,这对于在本地审查内容很有用。
它也是提交更改的有用工具。
如果您不想使用 git-review
,您显然可以自己使用 Gerrit API 来为最新的变更集找到合适的参考。例如:
ssh -p <gerrit_port> <gerrit_user>@<gerrit_host> gerrit query --current-patch-set --format json <review_number>
这为您提供了一大块 JSON 描述给定的更改,包括有关当前补丁集的信息。您可以通过将 JSON 管道化为类似以下内容来提取它:
jq -r .currentPatchSet.ref
一个完整的示例,使用 git-review
项目本身:
$ ssh -p 29418 lars@review.openstack.org \
gerrit query --current-patch-set --format json 281504 \
| head -1 | jq -r .currentPatchSet.ref
refs/changes/04/281504/8
更新
还有另一种方法可以仅使用 git
命令来完成此操作。您可以对远程引用列表使用 git ls-remote
命令,它可能类似于:
$ git ls-remote https://review.gerrithub.io/org-name/project-name
211fd8c368d27a0c64ad260b8556ab11211b071a refs/changes/00/328300/1
f9a4f3206fa9746acc3aac044cd4ae8b31763186 refs/changes/00/328300/2
3c89f1432aed33514e57bf40764605675fc0e782 refs/changes/00/328300/3
cdf0b56f07009e0d87b605b98257fdb6352ff235 refs/changes/00/328300/4
6b8ef89aed4470be7a230412f0c73f7cce429eda refs/changes/00/328300/5
640f49347b19bec17360b613014e7af67054e2c8 refs/changes/00/328300/6
a45f2e9b05459faecdda8979aef4a87983e2f8a3 refs/changes/00/331800/1
7fab4ee270c21cd110388c01670a7ff4d1cbf41b refs/changes/00/334600/1
5944ffe73bc1cdaea26b0151b4c1e93ac1235584 refs/changes/00/334600/2
fc3789ac553484ce81c47dc0adb09128dfb43077 refs/changes/00/334600/3
8aa3592d48c686dd6313a4b8087addfd5a108491 refs/changes/00/334600/4
520b5c135d2889af90689d049aacf6138cca8c61 refs/changes/00/334600/5
如果我们想要审查 328300 的最新补丁的参考,我们可以像这样从上面提取它:
git ls-remote https://review.gerrithub.io/org-name/project-name |
awk '{print }' |
awk -F/ ' == "328300" {print [=15=], }' |
sort -k4 -n | tail -1 | awk '{print }'
这给了我们:
refs/changes/00/328300/6
因此,将其汇总到一个函数中并使用它来挑选评论:
find_latest_change () {
local remote=
local review=
git ls-remote $remote |
awk '{print }' |
awk -F/ -vreview=$review ' == review {print [=17=], }' |
sort -k4 -n |
tail -1 |
awk '{print }'
}
remote=https://review.gerrithub.io/org-name/project-name
latest=$(find_latest_change $remote 12345)
git fetch $remote $latest &&
git cherry-pick FETCH_HEAD
根据@larsks 的回复,我编写了一个真正适合我的版本。由于旧的 awk,他原来的 OS X 失败了,而且由于缺乏数字排序(10 > 2 不在 1 和 2 之间)也未能选择最新版本。
find_latest_change () {
local remote=
local review=
git ls-remote $remote | grep -E "refs/changes/[[:digit:]]+//" | sort -t / -k 5 -g | tail -n1 | awk '{print }'
}
remote=https://review.gerrithub.io/org-name/project-name
latest=$(find_latest_change $remote 12345)
git fetch $remote $latest && git cherry-pick FETCH_HEAD
是否有一种可编写脚本的方式来挑选最新版本的 gerrit 补丁审查?
在 Gerrit 界面上,您可以轻松复制 cherry pick 的代码,但此代码指定了特定版本,我对某些 bash 代码感兴趣,这些代码会选择最新版本而不是特定版本。
git fetch https://review.gerrithub.io/org-name/project-name refs/changes/02/12345/5 && git cherry-pick FETCH_HEAD
如您所见,这将选择版本 5。
更新
git review -s
git review -x 123456
我在本地尝试了 review -x 方法,它起作用了,但是 运行 Jenkins 的一些方法失败了:
Could not connect to gerrit.
Enter your gerrit username: <traceback object at 0x285ecf8>
We don't know where your gerrit is. Please manually create a remote
named "gerrit" and try again.
git-review 工具让这一切变得非常简单。它使用 gerrit API 查找可用于给定评论的最新变更集。
例如,您可以 运行...
git review -x 12345
...将指定更改的最新版本挑选到您的本地分支中。还有一个 -d
选项,它将更改公开为一个新分支,这对于在本地审查内容很有用。
它也是提交更改的有用工具。
如果您不想使用 git-review
,您显然可以自己使用 Gerrit API 来为最新的变更集找到合适的参考。例如:
ssh -p <gerrit_port> <gerrit_user>@<gerrit_host> gerrit query --current-patch-set --format json <review_number>
这为您提供了一大块 JSON 描述给定的更改,包括有关当前补丁集的信息。您可以通过将 JSON 管道化为类似以下内容来提取它:
jq -r .currentPatchSet.ref
一个完整的示例,使用 git-review
项目本身:
$ ssh -p 29418 lars@review.openstack.org \
gerrit query --current-patch-set --format json 281504 \
| head -1 | jq -r .currentPatchSet.ref
refs/changes/04/281504/8
更新
还有另一种方法可以仅使用 git
命令来完成此操作。您可以对远程引用列表使用 git ls-remote
命令,它可能类似于:
$ git ls-remote https://review.gerrithub.io/org-name/project-name
211fd8c368d27a0c64ad260b8556ab11211b071a refs/changes/00/328300/1
f9a4f3206fa9746acc3aac044cd4ae8b31763186 refs/changes/00/328300/2
3c89f1432aed33514e57bf40764605675fc0e782 refs/changes/00/328300/3
cdf0b56f07009e0d87b605b98257fdb6352ff235 refs/changes/00/328300/4
6b8ef89aed4470be7a230412f0c73f7cce429eda refs/changes/00/328300/5
640f49347b19bec17360b613014e7af67054e2c8 refs/changes/00/328300/6
a45f2e9b05459faecdda8979aef4a87983e2f8a3 refs/changes/00/331800/1
7fab4ee270c21cd110388c01670a7ff4d1cbf41b refs/changes/00/334600/1
5944ffe73bc1cdaea26b0151b4c1e93ac1235584 refs/changes/00/334600/2
fc3789ac553484ce81c47dc0adb09128dfb43077 refs/changes/00/334600/3
8aa3592d48c686dd6313a4b8087addfd5a108491 refs/changes/00/334600/4
520b5c135d2889af90689d049aacf6138cca8c61 refs/changes/00/334600/5
如果我们想要审查 328300 的最新补丁的参考,我们可以像这样从上面提取它:
git ls-remote https://review.gerrithub.io/org-name/project-name |
awk '{print }' |
awk -F/ ' == "328300" {print [=15=], }' |
sort -k4 -n | tail -1 | awk '{print }'
这给了我们:
refs/changes/00/328300/6
因此,将其汇总到一个函数中并使用它来挑选评论:
find_latest_change () {
local remote=
local review=
git ls-remote $remote |
awk '{print }' |
awk -F/ -vreview=$review ' == review {print [=17=], }' |
sort -k4 -n |
tail -1 |
awk '{print }'
}
remote=https://review.gerrithub.io/org-name/project-name
latest=$(find_latest_change $remote 12345)
git fetch $remote $latest &&
git cherry-pick FETCH_HEAD
根据@larsks 的回复,我编写了一个真正适合我的版本。由于旧的 awk,他原来的 OS X 失败了,而且由于缺乏数字排序(10 > 2 不在 1 和 2 之间)也未能选择最新版本。
find_latest_change () {
local remote=
local review=
git ls-remote $remote | grep -E "refs/changes/[[:digit:]]+//" | sort -t / -k 5 -g | tail -n1 | awk '{print }'
}
remote=https://review.gerrithub.io/org-name/project-name
latest=$(find_latest_change $remote 12345)
git fetch $remote $latest && git cherry-pick FETCH_HEAD