如何通过 curl 从 GitLab 项目的通用包注册表中删除文件?

问题描述

The documented way 通过 curl 从 GitLab 项目的包注册表中删除文件似乎对我不起作用。

文档说

curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/:id/packages/:package_id/package_files/:package_file_id"

所以例如如果我想从 ID 为 12345678 的项目的包注册表中名为“my-package”的通用包的 1.0.0 版中删除一个名为“myfile.ext”的文件,我认为这意味着该命令应该是

curl --request DELETE --header "PRIVATE-TOKEN: <my_access_token>" "https://gitlab.example.com/api/v4/projects/12345678/packages/my-package/package_files/myfile.ext"

但对我来说这会产生

{"error":"package_id is invalid,package_file_id is invalid"}

我也尝试了该命令的几个紧密变体,但都没有奏效。具体来说,我对删除的网址和上传的网址之间的差异感到惊讶,即:

  • 上传网址不包含 package_files/
  • 上传的 URL 包含文件 ID 之前的包版本,例如1.0.0/
  • 上传的 URL 包含 generic/ 以表明包是通用的,就在包 ID 之前

所以我尝试了包含/排除这三件事的所有 8 种组合,但除了原始组合之外的所有 7 种组合都产生了

{"error":"404 Not Found"}

我可以通过 curl 上传文件,也可以通过 GitLab 网络用户界面删除它。如何通过 curl 或更一般地从命令行删除它?

解决方法

这代表对文档中 package_idpackage_file_id 的含义的误解。这些分别不是包名和文件名。相反,包和文件每个都有一个自动分配的数字字符串 ID,就像项目一样——不过,令人困惑的是,项目的 ID 显示在 Web UI 中,而包和文件的则没有。>

您可以通过 Packages API 找到包和文件的 ID。您还可以在 Web UI 中分别根据包和文件的 URL 猜测它们。

使用正确的 ID 后,curl 删除命令按文档中的说明工作。