如何仅允许通过GitHub Release创建仓库标签?
确保仅GitHub Release可创建仓库标签的方案
方案一:通过GitHub Actions拦截非Release创建的标签
如果Ruleset找不到合适的绕过选项,用Action兜底是可行思路。核心逻辑是:标签创建时自动校验是否关联Release,无关联则直接删除标签。
创建.github/workflows/protect-tags.yml文件,写入以下内容:
name: 拦截非Release创建的标签 on: create: tags: - '*' jobs: 校验标签来源: runs-on: ubuntu-latest steps: - name: 检查标签是否由Release创建 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG_NAME: ${{ github.ref_name }} run: | # 调用GitHub API查询标签对应的Release信息 RELEASE_DATA=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG_NAME") # 检查返回结果中是否存在Release的ID(存在则说明是Release创建的标签) if echo "$RELEASE_DATA" | jq -e '.id' > /dev/null; then echo "标签 $TAG_NAME 由合法Release创建,放行。" else echo "标签 $TAG_NAME 不是由Release创建,删除中..." # 删除违规标签 git push origin :refs/tags/$TAG_NAME # 抛出错误终止流程 exit 1 fi
- 注意:
GITHUB_TOKEN是GitHub自动提供的Secrets,无需手动配置,它拥有操作仓库标签的权限。
方案二:优化Ruleset配置放行GitHub官方操作
如果希望用Ruleset原生能力解决,可通过“允许GitHub官方操作绕过限制”实现:
- 创建第一个规则集,负责保护标签的修改/删除:
- 目标选择「标签」,设置匹配模式(比如
*覆盖所有标签)。 - 勾选「阻止删除标签」和「阻止更新标签」,无需勾选「阻止创建标签」。
- 目标选择「标签」,设置匹配模式(比如
- 创建第二个规则集,专门限制标签创建:
- 目标同样选择「标签」,匹配模式
*。 - 勾选「阻止创建标签」。
- 在「绕过规则」区域,找到并勾选「GitHub」选项(该选项代表GitHub官方系统操作,包括Release创建标签)。
- 保存规则后,普通用户手动创建标签会被拦截,而Release创建标签的操作会自动绕过限制。
- 目标同样选择「标签」,匹配模式
提示:如果找不到「GitHub」绕过选项,可以临时勾选仓库管理员,但这样管理员仍能手动创建标签,需根据团队权限需求调整。
内容的提问来源于stack exchange,提问作者DaanS
相关产品推荐
相关产品推荐

