news 2026/9/10 8:12:11

如何用 GitHub CLI 的 gh release download 按 tag 和 pattern 下载指定 Release 资产?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 GitHub CLI 的 gh release download 按 tag 和 pattern 下载指定 Release 资产?

如何用 GitHub CLI 的 gh release download 按 tag 和 pattern 下载指定 Release 资产?

【免费下载链接】cliGitHub’s official command line tool项目地址: https://gitcode.com/GitHub_Trending/cli/cli

用 GitHub CLI(gh)管理仓库时,经常需要从某个 GitHub Release 中取出指定的资产文件,而不是把整个 Release 的所有附件都拉下来。gh release download就是完成这件事的命令:它可以按 release tag 定位到指定版本,再用 glob 形式的--pattern过滤出想要的那几个资产文件,下载到你指定的目录。本文基于 命令实现 与验收测试整理出完整的参数用法、冲突限制和验证方式。前提是你已安装gh并能访问目标仓库,安装方式可参考 README 中 macOS / Linux / Windows 的预编译二进制说明。

命令形式:tag 可选,但决定要不要写 pattern

命令的完整形式为:

gh release download [<tag>]

规则来自命令源码中的参数校验:

  • 提供 tag(如v1.2.3,请替换为你仓库中实际的 release tag)时,下载该 Release 的资产;不加 pattern 就下载该 Release 的全部资产。
  • 不提供 tag 时,gh从项目的最新 Release下载,此时--pattern--archive二者必填其一,否则报错:
`--pattern` or `--archive` is required when downloading the latest release

按 tag 下载全部资产

主路径是最短命令——在任意目录(或克隆好的仓库目录)下直接指定 tag:

gh release download v1.2.3

默认下载目录由-D, --dir控制,默认值为当前目录.。如果要在其他仓库中下载而不依赖当前 git 目录,可加-R, --repo指向目标仓库(release命令组通过cmdutil.EnableRepoOverride启用了该覆盖)。

仓库自带的验收测试展示的正是这条主路径:先gh release upload v1.2.3 ../asset.txt上传资产,再执行gh release download v1.2.3,随后用exists asset.txt确认文件已出现在当前目录(见 release-upload-download.txtar)。

用 --pattern 按文件名过滤资产

-p, --pattern是 glob 模式,只下载与模式匹配的资产;模式与资产的完整文件名做 glob 匹配,可以重复传多次,多个模式之间是"任一匹配即下载"的关系:

# 只下载 tar 包 $ gh release download v1.2.3 -p '*.tgz' # 同时匹配 Debian 与 RPM 包 $ gh release download -p '*.deb' -p '*.rpm'

第二条不带 tag,因此作用于最新 Release,满足"无 tag 必须带 pattern 或 archive"的校验。结合-D可以指定落地目录,目录不存在时会自动创建(实现中通过MkdirAll保证):

$ gh release download v1.2.3 -p 'windows-*.zip' -D tmp/assets

pattern 匹配不上时,命令会给出明确的错误而不是静默成功:

  • Release 有资产但无匹配项:no assets match the file pattern
  • Release 本身没有任何资产:no assets to download

出现这两类报错时,先核对资产文件名(例如用gh release view v1.2.3查看),再修正 pattern。

可选分支:下载源码归档而不是上传的资产

如果目标是该 tag 对应的源码归档而非 Release 上手动上传的附件,用-A, --archive

$ gh release download v1.2.3 --archive=zip

取值只允许ziptar.gz,其他值报错:the value for--archivemust be one of "zip" or "tar.gz"。注意--archive--pattern互斥,同时给出会报specify only one of '--pattern' or '--archive'。归档文件的保存名来自服务端响应头,验收测试中--archive=zip的产物形如myrepo-1.2.3.zip(文档示例)。如果目标 Release 是 draft(草稿),归档 URL 不存在,报错会提示:

release "patch-36" with tag "v1.2.3", does not have a "tar.gz" archive asset. Most likely, this is because it is a draft.

(以上为 download_test.go 中记录的实际报错示例。)

控制落盘位置:--output、--clobber 与 --skip-existing

几个标志的冲突规则在执行前就会校验,报错信息可以直接当作参数约束来记:

约束报错信息
--clobber--skip-existing二选一specify only one of--clobberor--skip-existing``
-D/--dir-O/--output二选一specify only one of--diror--output``
--pattern--archive二选一specify only one of '--pattern' or '--archive'
  • -O, --output FILE:把单个资产直接写入指定文件,适合 pattern 恰好只命中一个资产的场景;若匹配到多个资产,报错unable to write more than one asset with--output, got N assets
  • -O -表示写标准输出。写 stdout 时有安全限制:在终端(TTY)下拒绝直接输出二进制内容;资产包含终端转义序列时会报the asset contains terminal escape sequences; use--outputto save it to a file, or pass --allow-escape-sequences to output it anyway。确需原样输出时加--allow-escape-sequences
  • 目标文件已存在时的默认行为是报错停止already exists (use--clobberto overwrite file or--skip-existingto skip file)--clobber覆盖同名文件,--skip-existing跳过同名文件继续下载其余资产。

结果验证与常见报错对照

验证方式与仓库验收测试一致:命令正常退出后,检查目标目录(--dir指定目录或当前目录)下是否出现预期的资产文件。失败时按以下报错定位,这些文案均出自实现代码:

  • `--pattern` or `--archive` is required when downloading the latest release—— 未给 tag 且未给 pattern/archive,补上参数或显式写 tag。
  • no assets match the file pattern—— pattern 与资产名不匹配,用gh release view <tag>核对真实文件名。
  • no assets to download—— 该 Release 没有上传任何资产。
  • already exists (...)—— 目录中已有同名文件,按需求选--clobber--skip-existing
  • 在 Windows 上,若 Release 含CONNUL等保留文件名,会报unable to download release due to asset with reserved filename "CON.tgz",整个下载中止,需要先在 Release 端处理该资产。

更多参数与行为的边界情况,可进一步查看 参数解析测试 与 release 命令组入口。

【免费下载链接】cliGitHub’s official command line tool项目地址: https://gitcode.com/GitHub_Trending/cli/cli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 8:11:28

Delegatecall存储碰撞漏洞详解:从EVM存储布局到DeFi安全审计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 8:10:29

ESP32 RMT外设详解:从NEC协议到红外学习发射器实战

看看家里的电器遥控器&#xff0c;十个里面有八个是红外&#xff0c;电视、空调、机顶盒、风扇&#xff0c;全是那一枚小灯珠在前头闪。但你要是真拿示波器去量它的输出&#xff0c;会发现这玩意儿一点都不简单——一串宽度各异的脉冲&#xff0c;有的几百微秒&#xff0c;有的…

作者头像 李华
网站建设 2026/9/10 8:08:30

OpenAI与Anthropic的AI硬件定义权之争:芯片、入口与生态

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 8:06:54

Open WebUI存储型DOM XSS漏洞(CVE-2025-64495)深度复现分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华