删除 GitHub 草稿发布的命令

Command to remove GitHub Draft release

我正在尝试删除 GitHub 中的一个版本,所以我正在做

git tag -d {release-tag-name}
git push origin :{release-tag-name}

这会删除标签(本地和远程),但会在 GitHub 中留下一个 Draft 版本,我也想将其删除。

我可以通过登录 GitHub 并单击删除按钮来删除它,但我想避免通过网站执行此操作。

是否有实现此目的的命令?我发现了其他一些关于删除标签的类似帖子,但他们最终都去 GitHub 删除了 Draft.

编辑

在此question's accepted answer中,第2步和第5步与我的问题有关。第 2 步说 This will turn your "Release" on GitHub into a Draft that you can later delete.,而第 5 步指示删除 GitHub 站点中的草稿,而不是通过命令。

发布不是 git CLI 可以帮助您的东西。

版本是 GitHub 特定的东西。

您可以使用 GitHub API 到 create/update/delete 版本。

DELETE /repos/:owner/:repo/releases/:id

如果您想自动与 GitHub API 交互,您可以执行以下操作:

  1. Get an API token 具有适当的权限。
  2. 将其存储在某处,比方说环境变量。
  3. 写几个脚本。

例如,在这种情况下,您可以使用一个脚本来删除本地标签,调用 API 获取标签 ID by name,删除远程标签并删除一个版本。

我也需要这样做。 Anton Sizikov 的回答是正确的,但直接使用 github 的 api 有时可能有点棘手。

hub had an issue on this, and the PR is now merged

要删除一个版本,您需要做的就是 install hub 和 运行 在您的项目文件夹中:

hub release delete <TAG>

您可以删除所有类似这样的版本

git fetch --all --tags
git tag | xargs hub release delete

或者您可以在文件中列出所有要删除的标签(每行一个标签),然后执行此操作:

cat tags_i_want_to_delete.txt | xargs hub release delete

tldr xargs for details

替代解决方案:使用 nodejs 示例删除草稿标签

感谢 Steve Mao github-remove-all-releases!

npm init
npm install --save github-remove-all-releases dotenv

main.js:

require('dotenv').config();

var githubRemoveAllReleases = require('github-remove-all-releases');

var AUTH = {
    type: 'oauth',
    token: process.env.GITHUB_TOKEN
};

// this is where the magic happens, we filter on tag.draft, if it's true, it will get deleted
a_filter = function (tag) {
    return Boolean(tag.draft);
};

a_callback = function (result) {
    console.log (result);
};

githubRemoveAllReleases(AUTH, process.env.GITHUB_OWNER, process.env.GITHUB_REPO, a_callback, a_filter);

Get yourself a token 并创建一个 .env 文件,如下所示:

GITHUB_OWNER=owner
GITHUB_REPO=repo
GITHUB_TOKEN=your_token

然后运行这个(几次因为不支持分页):

npm main.js

由于@GabLeRoux 指出 hub 现在包括删除发布的能力,并且它能够按照我们的意愿列出草稿和格式化输出,我写了以下内容来删除所有草稿发布我们的回购:

hub release -f "%T (%S) %n" --include-drafts | grep " (draft)" | awk '{print }' | xargs -t -n1 hub release delete

分解:

hub release -f "%T (%S) %n" --include-drafts:打印所有版本,如果它们的状态类似于 "draft" 或 "pre-release",请将该状态放在括号内。你最终会得到这样的输出:

release-name-1 ()
release-name-2 ()
release-name-3 (draft)
release-name-4 ()
release-name-5 (draft)
release-name-6

现在将其通过管道传输到 | grep " (draft)" 以便我们只打印带有 (draft):

的行
release-name-3 (draft)
release-name-5 (draft)

现在,对于这些行中的每一行,将其通过管道传输到 | awk '{print }' 以仅获取第一部分(在第一行 space 之前)。 (如果任何版本的名称中包含 space,这将不起作用):

release-name-3
release-name-5

现在将所有这些草稿版本名称通过管道传输到 xargs -t -n1 hub release delete,这将为每一行输入调用 hub release delete <RELEASE_NAME_HERE>

hub release delete release-name-3
hub release delete release-name-5

(至于那些 xargs 参数:-t 首先回显命令,然后 -n1 告诉它为每一行输入单独调用 hub。)

如果您想慢慢查看它认为应该删除的草稿版本,只需 运行 这部分:

hub release -f "%T (%S) %n" --include-drafts | grep " (draft)" | awk '{print }'

如果你想真正慢下来,将 -p 作为参数添加到 xargs,它会在 运行 执行每个命令之前提示你。