如何一次性批量下载GitHub项目所有Releases及tags版本
批量下载GitHub仓库所有Tag对应Release的实现方案
使用前先确认本地已安装依赖工具:curl(网络请求)、jq(JSON解析),Linux/macOS可直接通过对应包管理器安装,Windows环境可在WSL/Git Bash中执行下述命令。
方案1:单行命令快速执行
适合Release总数少于100的小型仓库,直接替换命令中仓库所有者、仓库名字段(格式参考torvalds/linux),执行后会自动拉取所有版本的Release资产到当前目录:
# 替换OWNER和REPO变量为目标仓库信息 OWNER="仓库所有者"; REPO="仓库名"; curl -s "https://api.github.com/repos/$OWNER/$REPO/releases?per_page=100" | jq -r '.[] | .tag_name as $tag | .assets[] | "echo 正在下载版本: \($tag) 文件名: \(.name) && curl -L -o \($tag)_\(.name) \(.browser_download_url)"' | bash
方案2:可复用Shell脚本(支持分页、断点续传、重复下载跳过)
适合Release数量多、文件体积大的仓库,不会漏拉分页内容,也不会重复下载已存在的文件:
#!/bin/bash set -e # 参数校验 if [ $# -lt 2 ]; then echo "用法: $0 <仓库所有者> <仓库名> [保存路径]" exit 1 fi OWNER=$1 REPO=$2 SAVE_DIR=${3:-"./${OWNER}_${REPO}_all_releases"} mkdir -p "$SAVE_DIR" cd "$SAVE_DIR" PAGE=1 while true; do echo "正在拉取第 $PAGE 页Release列表..." # 私有仓库可在curl参数中加 -H "Authorization: token 你的GitHub个人访问令牌" RESP=$(curl -s "https://api.github.com/repos/$OWNER/$REPO/releases?per_page=100&page=$PAGE") # 当前页无数据时终止循环 if [ "$(echo "$RESP" | jq 'length')" = "0" ]; then break fi # 遍历当前页所有版本 echo "$RESP" | jq -c '.[]' | while read -r release; do TAG=$(echo "$release" | jq -r '.tag_name') echo "=== 开始处理版本: $TAG ===" mkdir -p "./$TAG" # 遍历当前版本下所有上传的资产文件 echo "$release" | jq -c '.assets[]' | while read -r asset; do FILE_NAME=$(echo "$asset" | jq -r '.name') DOWNLOAD_URL=$(echo "$asset" | jq -r '.browser_download_url') FILE_PATH="./$TAG/$FILE_NAME" if [ -f "$FILE_PATH" ]; then echo "文件 $FILE_NAME 已存在,跳过下载" continue fi echo "正在下载: $FILE_NAME" # -C - 参数支持断点续传 curl -L -C - -o "$FILE_PATH" "$DOWNLOAD_URL" done done PAGE=$((PAGE+1)) done echo "全部版本下载完成,文件存储路径: $(pwd)"
脚本使用步骤:
- 将上述内容保存为
download_gh_releases.sh - 给脚本添加执行权限:
chmod +x download_gh_releases.sh - 执行示例(例如下载
cli/cli仓库的所有Release,保存到./gh_cli_releases目录):./download_gh_releases.sh cli cli ./gh_cli_releases
补充说明
- 未认证的GitHub API请求每小时有60次访问限制,下载大体积、多版本仓库时建议生成GitHub个人访问令牌,加到curl的请求头中,限额可提升至每小时5000次
- 如果需要下载Tag对应的源码包而非作者上传的预编译资产,可将脚本中资产下载的逻辑替换为源码包地址,源码包格式为
https://github.com/$OWNER/$REPO/archive/refs/tags/$TAG.tar.gz
内容的提问来源于stack exchange,提问作者Md. Masudur Rahman
相关产品推荐
相关产品推荐

