【问题标题】:How do I download binary files of a GitHub release?如何下载 GitHub 版本的二进制文件?
【发布时间】:2014-11-13 11:01:37
【问题描述】:

我有一个包含我需要的二进制文件的存储库。

我可以

git checkout tags/thetagoftherelease

这似乎检查了正确的标签,但没有拉下二进制文件。如何下拉添加到版本中的二进制文件(版本中的绿色框)?

在版本中添加了二进制文件的图片。

【问题讨论】:

  • 没有 cmets 的反对票没有帮助
  • Pull 还是 checkout?这是 Git 中两个非常不同的术语。还有,什么“绿盒子”?
  • 对不起,是口语化的使用 pull。如中的绿色框,将二进制文件添加到 git 上的发布中。它们显示为绿色框,您可以在 github 上手动下载。我想从发行版中下载这些添加的二进制文件。检查发布标签并没有给我二进制文件。
  • 据我了解,这些版本是 GitHub 功能,不属于您的存储库。我不认为你可以使用 Git 命令从 GitHub 下载它们。
  • 谢谢@Jubobs,如果你发布它,我会接受它作为答案。

标签: git github binary tags release


【解决方案1】:

一步法:

这是我在脚本中用于从 Github 下载 Digital Oceandoctl 界面的单行代码(sans auth)。它只是抓取 LATEST 版本并将其解压缩:

curl -sL $(curl -s https://api.github.com/repos/digitalocean/doctl/releases/latest | grep "http.*linux-amd64.tar.gz" | awk '{print $2}' | sed 's|[\"\,]*||g') | tar xzvf -

如果不使用 Linux,请将上面的 "http.*linux-amd64.tar.gz" 替换为“darwin”、“windows”等和相应的arch。

注意:上述应该以编程方式从其他 Github 存储库中获取二进制文件,但我仅使用 doctl 对其进行了测试。 HTH-

【讨论】:

    【解决方案2】:

    这是一个下载资产的迷你脚本,知道它的文件名(可以轻松修改以下载其他资产:

    asseturl=$(curl -H "Authorization: token ${token}" https://api.github.com/repos/${repo}/releases/${releaseid}/assets | jq ".[] | select(.name==\"${filename}\") | .url")
    curl -L -H "Authorization: token ${token}" -H "Accept:application/octet-stream" $(echo $asseturl | tr -d '"') > ${filename}
    
    • $token 是 github 的访问令牌
    • $filename 是资产的文件名
    • $releaseid是存放二进制文件的releaseid

    【讨论】:

    • 如果您不知道releaseid,您可以使用curl -H "Authorization: token ${token}" https://api.github.com/repos/${owner}/${repo}/releases | jq -r ".[] | select(.name == \"${releasename}\") | .assets[] | select(.name == \"${filename}\") | .url" 按名称过滤/repos/{owner}/{repo}/releases
    【解决方案3】:

    我已经尝试了几天试图找到正确的答案,最后我想出了如何通过 curl 命令来做到这一点。这是一个 3 步过程。

    首先,获取最新版本的资产列表:

    curl -H "Authorization: token YOURGITHUBTOKEN" \
        https://api.github.com/repos/NAME/REPO/releases/latest 
    

    然后在 JSON 中,查找所需资产的 url。例如,它看起来像:

    "url": "https://api.github.com/repos/NAME/REPO/releases/assets/1275759"
    

    然后您将其传递给另一个 curl 命令以检索实际 URL,该 URL 实际上是指向 Amazon S3 文件的链接。

    curl -H "Authorization: token YOURGITHUBTOKEN" \
         -H "Accept:application/octet-stream" \
         -i https://api.github.com/repos/NAME/REPO/releases/assets/1275759
    

    URL 将在 HTTP 响应的“位置”字段中,然后使用 curl 获取文件,如下所示:

    curl "https://github-cloud.s3.amazonaws.com...." -i -o FILENAME
    

    【讨论】:

    • 最佳答案,谢谢。忘记 curl,使用 httpie.org(CLI HTTP 客户端,用户友好的 curl 替换,直观的 UI,JSON 支持,语法突出显示,类似 wget 的下载,扩展等。 )
    • 确保使用引号将 s3 url 括起来。否则 curl 将无法正确获取它。
    【解决方案4】:

    注意wgetcat 可以像浏览器一样通过下载链接直接获取。

    根据需要重写$URL。我的约定是上传二进制版本的后缀。

    一个示例脚本:

    #!/bin/bash
    #
    # You can fetch some binary directly from release on github
    #
    # We encourage to build your own version from source.
    #
    
    GIT_USER=me
    GIT_PROJECT=project_name
    BASE_URL=https://github.com/$GIT_USER/$GIT_PROJECT/releases/download
    RELEASE=v0.6.3-alpha1
    BINARY=bin_file_on_release
    
    if [[ -e $BINARY ]]
    then
      echo "file in the way: '$BINARY' remove it."
      exit 1
    fi
    
    if [[ $(getconf LONG_BIT) == "64" ]]
    then
        echo "I'm 64-bits"
        URL="$BASE_URL/$RELEASE/$BINARY"
    else
        echo "I'm 32-bits"
        URL="$BASE_URL/$RELEASE/${BINARY}-32bits"
    fi
    
    set -e
    echo "Fetching from: $URL"
    wget -q -O $BINARY "$URL"
    file $BINARY
    chmod a+x $BINARY
    

    【讨论】:

      【解决方案5】:

      对于 Ansible,您可以使用此任务列表(与 @ted 相同的步骤):

      - name: Get latest version
        uri:
          url: "https://api.github.com/repos/{{github_user}}/{{github_repo}}/releases/latest"
          return_content: yes
          headers:
            Authorization: "token {{ vault_github_deploying_token }}"
        register: github_response
      
      - set_fact:
          binary_asset_url: "{{  github_response.json.assets|json_query(query) }}"
        vars:
          query: "[?name=='{{your_github_binary_filename}}'].url | [0]"   
      
      - name: Get Binary asset's location
        uri:
          url: "{{ binary_asset_url }}"
          return_content: no
          follow_redirects: none
          status_code: 302
          headers:
            Authorization: "token {{ vault_github_deploying_token }}"
            Accept: "application/octet-stream"
        register: assets
      
      - name: Download binary
        get_url:
          url: "{{ assets.location }}"
          dest: "/tmp/{{ your_github_binary_filename }}"
          mode: 0755
      

      【讨论】:

      • 太棒了!对于大多数版本,your_github_binary_filename 通常是 "{{ github_repo }}.tar.gz"
      【解决方案6】:

      二进制发布资产存在于 Git 之外,无法使用标准工具进行管理。

      不过,它们应该可以通过 GitHub 的 API 获得。

      1. List the repository's release assets:

        GET /repos/:owner/:repo/releases/:id/assets
        

        这将返回一个 JSON 文档,其中列出了存储库的发布资产,例如

        [
          {
            "url": "https://api.github.com/repos/octocat/Hello-World/releases/assets/1",
            "browser_download_url": "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip",
            "id": 1,
            "name": "example.zip",
            "label": "short description",
            "state": "uploaded",
            "content_type": "application/zip",
            "size": 1024,
            "download_count": 42,
            "created_at": "2013-02-27T19:35:32Z",
            "updated_at": "2013-02-27T19:35:32Z",
            "uploader": {
              "login": "octocat",
              ...
            }
          }
        ]
        
      2. Retrieve the assts from the release you want,由上面的id 定义:

        GET /repos/:owner/:repo/releases/assets/:id
        

        如果您想下载资产的二进制内容,请传递"application/octet-stream" 的媒体类型。 API 会将客户端重定向到该位置,或者如果可能的话直接流式传输。 API 客户端应同时处理 200302 响应。

      作为documented,这些请求都是相对于https://api.github.com的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2014-07-27
        • 2012-11-23
        • 2016-05-06
        • 1970-01-01
        相关资源
        最近更新 更多