在 Gerrit 中,如何将任意标签推送到非标准位置?

In Gerrit, how can I push arbitrary tags to non-standard locations?

我想将构建标签推送到 gerrit 上的非标准位置,主要是为了避免它们显示为官方标签,同时也避免一堆构建标签污染用户。

在旧版本的 gerrit 上,我能够授予自己在 refs/builds/tags/* 中创建引用和标签的权限,然后执行

git push origin refs/tags/BUILD-123:refs/builds/tags/BUILD-123

这个方案的美妙之处在于,构建标签不会污染普通用户的 git 存储库,但如果有人对构建标签感兴趣,他们可以 运行:

git fetch origin 'refs/builds/tags/*:refs/tags/*'

然后所有构建标签出现并可用作标签。

似乎在较新版本的 gerrit(2.16?)上,直接推送仅限于标准位置。

似乎也只能将作为直接祖先的提交标记推送到现有分支,所以如果我的构建做了任何不寻常的事情(例如变基到尖端),它就会失败。

这可以在任何地方配置吗?

原来没有这样的限制,你只需要授予自己所有必需的权限,就像这样:

[access "refs/builds/*"]
    create = <me>
    createSignedTag = <me>
    createTag = <me>
    delete = <me>
    read = <me>

我忘了给自己读取权限...

存在的限制是您不能推送不是针对作为现有已知分支的祖先的提交的标记。存在此限制的原因是因为对提交的访问是通过 ACL 控制的,ACL 将通配符引用作为权限的主键。如果有人知道 "forbidden" sha 并被允许推送标签,则可以绕过此方案。

诀窍是放弃推送标签并改为推送分支。分支可以像标签一样被推送到非标准位置,如果有人将它们提取到 refs/tags,它们也像轻量级标签一样。