You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将原仓库Release复制到Fork?解决Action写入权限问题

批量迁移GitHub Release至Fork仓库的解决方案

方案一:使用GitHub CLI(gh)本地脚本迁移

无需依赖GitHub Actions权限,直接在本地完成全量Release迁移,操作简单易上手:

  1. 配置GitHub CLI
    本地安装gh工具后,执行gh auth login登录你的GitHub账号,确保账号有权限读取原仓库、写入你的Fork仓库(whichcam)。

  2. 编写批量迁移脚本(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
    
  3. 执行脚本
    赋予脚本执行权限:chmod +x migrate-releases.sh,运行./migrate-releases.sh即可自动完成所有Release的迁移。

方案二:通过GitHub API自定义脚本迁移

适合需要更精细化控制的场景,核心是使用**带repo权限的Personal Access Token(PAT)**绕过Actions权限限制:

  1. 创建权限足够的PAT
    在GitHub账号设置中生成PAT,勾选repo权限(确保能读写你的Fork仓库、读取原仓库)。

  2. 编写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)}
            )
    
  3. 运行脚本
    安装依赖:pip install requests,执行脚本即可完成迁移。

关键注意事项

  • 确保你的PAT或GitHub CLI账号拥有对应仓库的读写权限,避免迁移失败。
  • 若原仓库包含大体积资产,建议在网络稳定的环境下执行脚本,防止中断。
  • 迁移前可先手动测试单个Release的迁移流程,确认逻辑无误后再批量执行。

内容的提问来源于stack exchange,提问作者MidKnight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:34:51