如何将原仓库Release复制到Fork?解决Action写入权限问题
批量迁移GitHub Release至Fork仓库的解决方案
方案一:使用GitHub CLI(gh)本地脚本迁移
无需依赖GitHub Actions权限,直接在本地完成全量Release迁移,操作简单易上手:
配置GitHub CLI
本地安装gh工具后,执行gh auth login登录你的GitHub账号,确保账号有权限读取原仓库、写入你的Fork仓库(whichcam)。编写批量迁移脚本(Bash)
创建migrate-releases.sh文件,替换其中的仓库地址后即可使用:# 替换为原仓库(格式:owner/repo-name)和你的Fork仓库地址 SOURCE_REPO="原仓库所有者/原仓库名" TARGET_REPO="你的GitHub用户名/whichcam" # 获取原仓库所有Release的ID列表 RELEASE_IDS=$(gh release list --repo "$SOURCE_REPO" --json id --jq '.[].id') for ID in $RELEASE_IDS; do # 拉取单个Release的完整数据 RELEASE_DATA=$(gh release view "$ID" --repo "$SOURCE_REPO" --json tagName,name,body,draft,prerelease,assets) # 提取Release核心信息 TAG_NAME=$(echo "$RELEASE_DATA" | jq -r '.tagName') RELEASE_TITLE=$(echo "$RELEASE_DATA" | jq -r '.name') RELEASE_BODY=$(echo "$RELEASE_DATA" | jq -r '.body') IS_DRAFT=$(echo "$RELEASE_DATA" | jq -r '.draft') IS_PRERELEASE=$(echo "$RELEASE_DATA" | jq -r '.prerelease') # 在Fork仓库创建对应Release gh release create "$TAG_NAME" \ --repo "$TARGET_REPO" \ --title "$RELEASE_TITLE" \ --notes "$RELEASE_BODY" \ --draft="$IS_DRAFT" \ --prerelease="$IS_PRERELEASE" # 迁移所有附件资产 ASSET_URLS=$(echo "$RELEASE_DATA" | jq -r '.assets[].url') for ASSET_URL in $ASSET_URLS; do ASSET_NAME=$(echo "$ASSET_URL" | awk -F '/' '{print $NF}') # 下载资产到本地临时文件 curl -L -o "$ASSET_NAME" "$ASSET_URL" # 上传至Fork仓库的对应Release gh release upload "$TAG_NAME" "$ASSET_NAME" --repo "$TARGET_REPO" # 清理本地临时文件 rm "$ASSET_NAME" done done执行脚本
赋予脚本执行权限:chmod +x migrate-releases.sh,运行./migrate-releases.sh即可自动完成所有Release的迁移。
方案二:通过GitHub API自定义脚本迁移
适合需要更精细化控制的场景,核心是使用**带repo权限的Personal Access Token(PAT)**绕过Actions权限限制:
创建权限足够的PAT
在GitHub账号设置中生成PAT,勾选repo权限(确保能读写你的Fork仓库、读取原仓库)。编写Python迁移脚本
以下脚本会自动遍历原仓库Release,复制标签、描述、状态及所有资产到你的Fork:import requests # 配置参数 SOURCE_REPO = "原仓库所有者/原仓库名" TARGET_REPO = "你的GitHub用户名/whichcam" PAT = "你的GitHub PAT" HEADERS = {"Authorization": f"token {PAT}"} # 获取原仓库所有Release数据 source_releases = requests.get( f"https://api.github.com/repos/{SOURCE_REPO}/releases", headers=HEADERS ).json() for release in source_releases: # 构建Fork仓库Release的创建参数 release_payload = { "tag_name": release["tag_name"], "name": release["name"], "body": release["body"], "draft": release["draft"], "prerelease": release["prerelease"] } # 在Fork仓库创建Release target_release = requests.post( f"https://api.github.com/repos/{TARGET_REPO}/releases", json=release_payload, headers=HEADERS ).json() # 迁移Release附件资产 for asset in release["assets"]: # 下载原仓库资产 asset_content = requests.get( asset["url"], headers={**HEADERS, "Accept": "application/octet-stream"} ) # 上传至Fork仓库的对应Release upload_url = target_release["upload_url"].split("{?")[0] requests.post( upload_url, headers={**HEADERS, "Content-Type": asset["content_type"]}, files={"file": (asset["name"], asset_content.content)} )运行脚本
安装依赖:pip install requests,执行脚本即可完成迁移。
关键注意事项
- 确保你的PAT或GitHub CLI账号拥有对应仓库的读写权限,避免迁移失败。
- 若原仓库包含大体积资产,建议在网络稳定的环境下执行脚本,防止中断。
- 迁移前可先手动测试单个Release的迁移流程,确认逻辑无误后再批量执行。
内容的提问来源于stack exchange,提问作者MidKnight
相关产品推荐
相关产品推荐

