是否有指向GitHub的链接,用于在最新版本的存储库中下载文件?


137

使用GitHub的Release功能,可以提供下载特定版本已发布软件的链接。但是,每次发布时,gh页也需要更新。

有没有一种方法可以链接到特定文件的最新软件版本?

例如,这将是一个静态链接:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

我想要的是这样的:

https://github.com/USER/PROJECT/releases/download/latest/package.zip

注意:此问题与GitHub最新版本之间的区别在于 ,此问题专门要求获得对文件的访问权限,而不是GitHub最新版本页面


1
Github现在对此提供了本地支持(URL格式略有不同)。参见stackoverflow.com/questions/24987542/…–
wisbucky

Answers:


38

迟了几年,但是我只是实现了一个简单的重定向来支持https://github.com/USER/PROJECT/releases/latest/download/package.zip。那应该重定向到最新的标记package.zip发布资产。希望它很方便!


2
help.github.com/en/articles/linking-to-releases记录如果您想直接链接到最新发行资产的下载,则可以链接到/ owner / name / releases / latest / download / asset -name.zip
Liam,

4
但是,如果此功能与版本化资产名称一起使用,将很有帮助。
利亚姆

3
请注意,为了切换.../releases/latest/download/...VS .../releases/download/v0.0.0/...。你不能简单地更换v0.0.0latest到位。
wisbucky19年

2
@Joshua Peek也许您可以扩展此名称,以将资产名称中的“ LATEST”扩展为版本字符串?这对于名称带有版本号的资产很有用。
jwatt

如何下载最新的源代码?在这种情况下,资产的名称是什么?
skd

59

Linux解决方案以获取最新版本的资产下载链接(仅在版本仅包含一项资产的情况下有效)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4

7
管道中的另一个grep将找到适合您的发行版和体系结构的文件。对于64位Ubuntu上的atom文本编辑器:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
滚刀,2015年

3
不再有browser_download_url。您现在可以使用tarball_url。curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
maikel '16

4
对于浏览器_download_url,@ maikel grepping仍然对我有用。
黎逸麟

@léo-lam你是对的。即使您没有资产,也可以使用tarball_url获取源代码。
迈克尔

您只能加载最新版本以避免 | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck

29

您可以使用GitHub Releases API发出ajax请求以获取最新版本的下载URL 。它还显示了它的发布时间和下载次数:

function GetLatestReleaseInfo() {
  $.getJSON("https://api.github.com/repos/ShareX/ShareX/releases/latest").done(function(release) {
    var asset = release.assets[0];
    var downloadCount = 0;
    for (var i = 0; i < release.assets.length; i++) {
      downloadCount += release.assets[i].download_count;
    }
    var oneHour = 60 * 60 * 1000;
    var oneDay = 24 * oneHour;
    var dateDiff = new Date() - new Date(asset.updated_at);
    var timeAgo;
    if (dateDiff < oneDay) {
      timeAgo = (dateDiff / oneHour).toFixed(1) + " hours ago";
    } else {
      timeAgo = (dateDiff / oneDay).toFixed(1) + " days ago";
    }
    var releaseInfo = release.name + " was updated " + timeAgo + " and downloaded " + downloadCount.toLocaleString() + " times.";
    $(".download").attr("href", asset.browser_download_url);
    $(".release-info").text(releaseInfo);
    $(".release-info").fadeIn("slow");
  });
}

GetLatestReleaseInfo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="download" href="https://github.com/ShareX/ShareX/releases/latest">Download</a>
<p class="release-info"></p>

对您而言,将默认按钮URL设置到发布页面(例如https://github.com/ShareX/ShareX/releases/latest)非常重要,这样一来,如果浏览器不支持Ajax(或javascript)或速度太慢而无法取得网址后,下载按钮仍然可以使用。

Ajax请求完成后,此按钮的URL将自动更改为直接下载URL。

编辑:

我还制作了一个下载页面,其中显示了多个发行版本,您可以在这里找到它们:https : //getsharex.com/downloads/

它的源代码:https : //github.com/ShareX/sharex.github.io/blob/master/js/downloads.js


凉。您知道为什么这可能行不通吗?curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte 2015年

因为您没有任何发布。检查:api.github.com/repos/DataTables/DataTables/releases
Jaex 2015年

时髦... github.com/DataTables/DataTables/releases显示了一堆版本。那里一定有歧义。
Volte 2015年

不,这些只是标签。没有发布。
MrD

2
github.com/jquery/jquery/releases他们没有任何发布。这只是版本标签。
Jaex

15

从命令行使用curljq,获取最新版本的第一个文件:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'

1
jq --raw-output是删除引号的更干净的方法。如果您只想要最新的,则获取.../releases/latest和删除它的价格便宜.[0] | 。但是获取所有发行版都允许进行类似jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...的查询
Beni Cherniavsky-Paskin 2015年

感谢Beni,我在此方面做了扩展,以获取最新的docker-compose 、curl --silent "https://api.github.com/repos/docker/compose/releases/latest" | jq --arg PLATFORM_ARCH "$(echo `uname -s`-`uname -m`)" -r '.assets[] | select(.name | endswith($PLATFORM_ARCH)).browser_download_url' | xargs sudo curl -L -o /usr/local/bin/docker-compose --url 。endswith是神奇的东西,使用拱门使我可以忽略通常存在的what.sha256文件而没有做|head -n 1
dragon788

8

另一种使用curl和wget从最新发行版页面下载单个二进制文件的Linux解决方案

curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[0-9]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollector

说明:

curl -s -L 是静默下载最新版本的HTML(在重定向之后)

egrep -o '...' 使用正则表达式查找所需的文件

wget --base=http://github.com/ -i - 将管道的相对路径转换为绝对URL

-O scollector设置所需的文件名。

-N如果文件较新,但是S3出现403 Forbidden错误,则可能只能添加到下载中。


3
我的目标是在网站上建立一个始终指向最新版本的链接。linux命令将不允许这样做。
Christian Rondeau

1
这就是我想要的,但是在使用grep时,必须确保您具有正确的通配符和点转义符。
T. Thomas

@TdotThomas谢谢,这是我需要的提示版本编号,以避开句点,\.例如2.2.0/download/[0-9\.]*/
Jeff Puckett

不,不是。没有转义字符。但是我假定一个可选的v前缀,例如tag v0.11.0。只需curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[v]?[0-9.]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollector在您的CLI中输入,它就能完美运行。谢谢你,格雷格!
MS Berends

7

如前所述,jq对于此REST API和其他REST API很有用。

tl; dr-以下是更多详细信息

假设您要发布macOS

URL=$( curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
   | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url' )
curl -LO "$URL"

原子释放的解决方案

请注意,每个回购可以采用不同的方式提供所需的工件,因此我将演示一个行为良好的原子

获取已发布资产的名称

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | .name'

atom-1.15.0-delta.nupkg
atom-1.15.0-full.nupkg
atom-amd64.deb
...

获取所需资产的下载URL

atom-mac下面是我通过jq想要的资产select(.name=="atom-mac.zip")

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url'

https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip

下载工件

curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

jq游乐场

jq语法可能很困难。这是一个试验jq以上内容的游乐场:https : //jqplay.org/s/h6_LfoEHLZ

安全

您应该采取措施通过sha256sum和gpg确保下载的工件的有效性,如果可能的话。


7

一种使用(内部)wget来获取HTML内容的解决方案,使用ziprep(例如egrep)对其进行过滤,然后下载zip文件(使用外部wget)。

wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)

6

只需使用以下网址之一即可下载最新版本:(例如,从boxbilling项目中获取网址):https ://api.github.com/repos/boxbilling/boxbilling/releases

以zip格式下载最新版本:https//api.github.com/repos/boxbilling/boxbilling/zipball

以tarball下载最新版本:https//api.github.com/repos/boxbilling/boxbilling/tarball

单击其中一个URL立即下载最新版本。当我编写此行时,当前为:boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

更新:在我的日志文件中找到另一个URL(请参见上面的示例) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
那些不是回购协议
摇晃

5

根据GitHub支持,截至2018-05-23,这是不可能的

于2018-05-23与support@github.com联系并提供了以下信息:

您能确定目前除了弄乱API之外没有其他方法吗?

他们回答:

感谢您与我们联系。我们建议使用API​​来获取最新版本,因为该方法稳定,有据可查,并且不会在短期内发生变化:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

我还将在以下位置进行跟踪:https : //github.com/isaacs/github/issues/658

没有任何依赖关系的Python解决方案

坚固耐用:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

也可以看看:

还考虑预发行

/latest没有看到预发布版本,但是由于首先/releases显示了最新版本,因此很容易做到:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json[0]['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

3

链接到版本”帮助页面确实提到了“最新版本”按钮,但这并没有为您提供下载链接。

https://github.com/reactiveui/ReactiveUI/releases/latest

为此,您需要首先获取最新标签(如“ 下载文件的最新版本的GitHub URL ? ”中所述):

latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip

2
gh-pages每次创建新版本时,仍然需要推送分支的新版本。目的是要有一个静态链接,我可以使用它来“引用最新版本”。现在,我最好的选择是仅参考发行页面。
Christian Rondeau 2014年

@ChristianRondeau我同意。我在API的任何地方都没有找到直接引用“最新”版本存档完整URL的方法。
VonC 2014年

不过,谢谢你的小费;如果没有更好的答案,我可能最终会使用您的脚本编写脚本来更新gh页。
Christian Rondeau

2

在PHP中-重定向到最新版本的下载。只需放在您的网站空间

<?php

/**
 * Download latest release from github release articats
 * License: Public Domain
 */

define('REPO', 'imi-digital/iRobo');

$opts = [
    'http' => [
        'method' => 'GET',
        'header' => [
            'User-Agent: PHP'
        ]
    ]
];

$context = stream_context_create($opts);

$releases = file_get_contents('https://api.github.com/repos/' . REPO . '/releases', false, $context);
$releases = json_decode($releases);

$url = $releases[0]->assets[0]->browser_download_url;

header('Location: ' . $url);

2

如果您只想使用curl,则可以尝试使用-w '%{url_effective}'此方法在重定向链后打印URL(如果使用调用,则跟随curl -L)。因此,例如

curl -sLo /dev/null -w '%{url_effective}' https://github.com/github-tools/github/releases/latest

输出https://github.com/github-tools/github/releases/tag/v3.1.0


2

Github现在支持从最新版本下载单个文件的静态链接:https : //help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip

六个月前已经发布了相同的答案:stackoverflow.com/questions/24987542/…–
wisbucky

感谢@wisbucky引起我的注意,然后我将其取消,因为它听起来像是开发人员(而不是StackOverflow的人员)的自定义实现!
Christian Rondeau

2

像大多数访问此问题的人一样,我对在Github中找到一种完全自动下载LATEST版本的发行版或存储库的方法感到非常沮丧。此解决方案的好处是您不必指定任何发行版或标签号-它只需抓住LATEST即可

我使用以下Github用户和仓库进行了测试:

f1linux ” = Github用户
pi-ap ” =回购

存储库保存到的任意目录名称设置在:

--one-top-level="pi-ap"

直接:

使用Firefox的“ Web Developer ”工具(右上角的3个栏),在“ 网络 ”部分中,我https://api.github.com重定向到https://codeload.github.com,因此通过将管道连接到curltar我可以获取最新版本的存储库并将其保存为可预测的名称,因此可以在以下位置进行操作:

curl https://codeload.github.com/f1linux/pi-ap/legacy.tar.gz/master | tar xzvf - --one-top-level="pi-ap" --strip-components 1

间接:

使用DIRECT URL 自动下载最新版本的软件后,我将注意力转向通过Github重定向来实现相同目的:

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

首选方法:

但是,请注意,根据下面冯的评论,INDIRECT首选方法

进一步验证:

为确保我的结果可复制到其他版本的Github存储库,对Digital Ocean的doctlapi工具包成功执行了相同的测试(实际上是整个练习的开始!):

这两个直接间接使用相同的形式上面,只是改变了用户名和回购工作:

直接:

curl https://codeload.github.com/digitalocean/doctl/legacy.tar.gz/master | tar xzvf - --one-top-level="doctl" --strip-components 1 

间接:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1

有趣。已投票。我仍然不知道代码加载,尽管仍然建议使用API​​:stackoverflow.com/a/60198721/6309
VonC

最初,我对重定向感到不安,正如答案中指出的那样,Firefox的“ Web Developer”工具使我步入正轨。但是不能止步于此,必须使它与重定向一起使用。感谢您的支持-非常有义务!
F1Linux

1
@VonC刚刚将您的反馈添加到了答案中。我完全不知道这一点。感谢您指出!
F1Linux

1

我想从README.md存储库描述中的文件下载发行版。在那里,我无法执行JavaScript。

我可以将这些链接添加到我所有存储库的README文件或github页面中:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    从资源库下载最新的发行文件。
  • https://niccokunzmann.github.io/download_latest/<FILE>
    这是可行的,因为设置了JavaScript引荐来源网址,并且通过确定了要下载的存储库document.referrer。因此,该链接也将适用于分叉。

您可以在此处找到源代码,或者使用我的仓库。


1
这是一个非常聪明的主意:)在共享链接或使用curl或类似方法时将不起作用,但是可以在项目的github页面中完成此主意。
Christian Rondeau

1
因为这可能是一个JavaScript网站,所以也可以编写一个进行重定向的服务。download-service.com/organization/repository/artifact
用户

0

如果回购仅使用标签而不是发布-请参见。jQuery-基于一个URL的解决方案不起作用。

相反,您必须查询所有标签,对它们进行排序并构造下载URL。我为Go语言和jQuery repo语言实现了这样的解决方案:Link to Github

也许,这可以帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.