我该如何下载GitHub发布的二进制文件?

23

我有一个包含二进制文件的代码库,我需要这些文件。

我可以

git checkout tags/thetagoftherelease

这似乎是正确的标签,但没有下载二进制文件。我应该如何下载已经添加到发布中的二进制文件(发布页面上的绿色框)?

发布页面上的二进制文件图片:

在此输入图片描述


20
没有评论的踩并不具有帮助性。 - Tyler Pfaff
“Pull”或“checkout”?这是Git中两个非常不同的术语。还有,“绿色框”是什么? - jub0bs
抱歉,我在口语上使用了“pull”。绿色框指的是在git上将二进制文件添加到发布中。它们显示为您可以在github上手动下载的绿色框。我想从发布中下载这些添加的二进制文件。检查发布标签并不能给我提供这些二进制文件。 - Tyler Pfaff
2
据我所知,这些发布是 GitHub 的一个功能,不是您的存储库的一部分。我认为您无法使用 Git 命令从 GitHub 下载它们。 - jub0bs
谢谢@Jubobs,如果你发帖,我会接受它作为答案。 - Tyler Pfaff
6个回答

36

我已经尝试了好几天,试图找到正确的答案,最终我通过curl命令找到了解决方法。这是一个三步骤的过程。

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

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,这实际上是指向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响应的"location"字段中,然后使用curl获取文件,如下:

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

1
最佳答案:忘记curl,使用http://httpie.org(CLI HTTP客户端,用户友好的curl替代品,具有直观的UI,JSON支持,语法高亮,类似wget的下载,扩展等)。谢谢。 - frekele
2
请确保使用引号将s3网址括起来。否则,curl将无法正确获取它。 - Erick A. Montañez
1
HTTP响应中的“位置字段”是什么?对我来说不起作用。 - decades

9

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

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

  1. List the repository's release assets:

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

    This will send back a JSON document listing the release assets for the repository, e.g.

    [
      {
        "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, as defined by its id from above:

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

    If you want to download the asset's binary content, pass a media type of "application/octet-stream". The API will either redirect the client to the location, or stream it directly if possible. API clients should handle both a 200 or 302 response.

文档所述,这些请求都是相对于https://api.github.com的。


4

一步流程:

这是我在一个脚本中使用的一个单行命令(不需要认证),用于从Github下载最新版本 doctl 接口,并解压缩它:

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"等和相应架构。

注意:上述方法在从其他GitHub存储库中编程获取二进制文件时应该有效,但我只测试了doctl。祝好运-


3
这是一个用于下载文件的小型脚本,可以根据文件名进行下载(也可以轻松修改以下载其他文件)。
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 是存储二进制文件的发布 ID

如果您不知道releaseid,则可以使用以下命令通过名称过滤/repos/{owner}/{repo}/releasescurl -H "Authorization: token ${token}" https://api.github.com/repos/${owner}/${repo}/releases | jq -r ".[] | select(.name == \"${releasename}\") | .assets[] | select(.name == \"${filename}\") | .url" - cyrf

2

对于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”。 - M. Davis

1
请注意,wget 可以像浏览器一样通过跟随下载链接直接获取它。
根据您的需要重写 $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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接