Czy istnieje łącze do GitHub umożliwiające pobranie pliku w najnowszej wersji repozytorium?

137

Korzystając z funkcji wydania GitHub , można podać łącze do pobrania określonej wersji opublikowanego oprogramowania. Jednak za każdym razem, gdy publikowane jest wydanie, strona gh również musi zostać zaktualizowana.

Czy istnieje sposób na uzyskanie łącza do określonego pliku niezależnie od najnowszej wersji oprogramowania?

np. byłby to link statyczny:

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

Chciałbym coś takiego:

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

UWAGA: Różnica między tym pytaniem a najnowszą wersją GitHub polega na tym, że to pytanie dotyczy konkretnie uzyskania dostępu do pliku, a nie strony z najnowszą wersją GitHub

Christian Rondeau
źródło
1
Jest to teraz obsługiwane natywnie przez Github (z niewielką różnicą w formacie adresu URL). Zobacz stackoverflow.com/questions/24987542/…
wisbucky

Odpowiedzi:

38

Kilka lat później, ale właśnie zaimplementowałem proste przekierowanie do pomocy technicznej https://github.com/USER/PROJECT/releases/latest/download/package.zip. Powinno to spowodować przekierowanie do package.zipzasobu z najnowszą oznaczoną wersją. Mam nadzieję, że to przydatne!

Joshua Peek
źródło
2
Udokumentowane na help.github.com/en/articles/linking-to-releases : Jeśli chcesz
Liam
4
Byłoby jednak pomocne, gdyby ta funkcja działała z wersjonowanymi nazwami zasobów.
Liam
3
Zauważ, że kolejność jest włączony .../releases/latest/download/...vs .../releases/download/v0.0.0/.... Nie można po prostu wymienić v0.0.0się latestna swoim miejscu.
wisbucky
2
@Joshua Peek Może mógłbyś rozszerzyć to, aby rozwinąć „LATEST” w nazwie zasobu, aby był ciągiem wersji? Byłoby to przydatne w przypadku zasobów z numerami wersji w nazwie.
jwatt
A co z pobieraniem najnowszego kodu źródłowego? Jaka jest w takim przypadku nazwa zasobu?
skd
59

Rozwiązanie dla systemu Linux umożliwiające uzyskanie łącza do najnowszego zasobu do pobrania (działa tylko wtedy, gdy wydanie ma tylko jeden zasób)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Putna
źródło
7
Jeden dodatkowy grep w potoku znajdzie plik dla twojej dystrybucji i architektury. Dla atomowego edytora tekstu na 64-bitowym Ubuntu:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
płyty grzewcze
3
Nie ma już adresu URL browser_download_url. Możesz teraz użyć 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
4
@maikel grepping for browser_download_url nadal działa dla mnie.
Léo Lam
@ léo-lam Masz rację. Jeśli nie masz zasobów, możesz użyć tarball_url, aby uzyskać kod źródłowy.
maikel
Możesz załadować tylko najnowszą wersję, aby uniknąć | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck.
29

Można zrobić ajax żądania, aby uzyskać najnowszą wersję pobierania URL przy użyciu GitHub uwalnia API . Pokazuje również, kiedy został wydany i liczbę pobrań:

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>

Ważne jest, aby ustawić domyślny adres URL przycisku na stronie z wydaniami (np. Https://github.com/ShareX/ShareX/releases/latest ), więc jeśli przeglądarka nie obsługuje ajax (lub javascript) lub jest zbyt wolna, aby uzyskać adres URL, przycisk pobierania będzie nadal działał.

Po zakończeniu żądania Ajax adres URL tego przycisku zmieni się automatycznie na bezpośredni adres URL pobierania.

Edytować:

Zrobiłem również stronę pobierania, która pokazuje wiele wydań, które można znaleźć tutaj: https://getsharex.com/downloads/

Kod źródłowy: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js

Jaex
źródło
Chłodny. Czy wiesz, dlaczego to może nie działać? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte
Ponieważ nie masz żadnego wydania. Sprawdź: api.github.com/repos/DataTables/DataTables/releases
Jaex
Funky ... github.com/DataTables/DataTables/releases pokazuje kilka wydań. W tym musi być jakaś niejasność.
Volte
Nie, to tylko tagi. Brak wydań.
MrD
2
github.com/jquery/jquery/releases nie mają żadnych wydań. To tylko tagi wersji.
Jaex
15

Z wiersza poleceń za pomocą curli jqpobiera pierwszy plik najnowszej wersji:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
źródło
1
jq --raw-outputto czystszy sposób na usuwanie cudzysłowów. Jeśli chcesz tylko najnowsze, taniej jest pobrać .../releases/latesti upuścić plik .[0] | . Ale pobranie wszystkich wersji pozwala na zapytania takie jak jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin,
Dzięki Beni, ja na to rozszerzona do zgrywania najnowszy Döcker-komponować 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 . Koniec z magią i użycie łuku pozwala mi zignorować pliki what.sha256, które są zwykle obecne, bez robienia tego |head -n 1.
dragon788
8

Kolejne rozwiązanie dla Linuksa używające curl i wget do pobrania pojedynczego pliku binarnego z najnowszej strony wydania

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

Wyjaśnienie:

curl -s -L jest po cichu pobrać najnowszą wersję HTML (po następującym przekierowaniu)

egrep -o '...' używa wyrażenia regularnego, aby znaleźć żądany plik

wget --base=http://github.com/ -i - konwertuje ścieżkę względną z potoku na bezwzględny adres URL

i -O scollectorustawia żądaną nazwę pliku.

może być w stanie dodać -Ntylko do pobrania, jeśli plik jest nowszy, ale S3 wyświetlał błąd 403 zabroniony.

Greg Bray
źródło
3
Moim celem jest umieszczenie w witrynie odnośnika, który zawsze będzie wskazywał najnowszą wersję. Polecenie linuxa na to nie pozwala.
Christian Rondeau
1
To jest to, czego szukałem, ale musisz upewnić się, że masz poprawne znaki ucieczki dla symboli wieloznacznych i kropek podczas używania grep.
T. Thomas
@TdotThomas dzięki, to jest wskazówka, której potrzebowałem, aby numery wydań semver uniknąć okresów, \.np. 2.2.0 potrzebnych/download/[0-9\.]*/
Jeff Puckett
Nie, to nieprawda. Brak znaku ucieczki. Ale byłoby przypuszczać opcjonalny vjako przedrostek, jak znacznika v0.11.0. Po prostu wprowadź 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 scollectorswój CLI i działa idealnie. Dziękuję Greg !!
MS Berends,
7

Jak wspomniano wcześniej, jq jest przydatny w przypadku tego i innych interfejsów API REST .

tl; dr - więcej szczegółów poniżej

Zakładając, że chcesz wydać 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"

Rozwiązanie dla wydań atomowych

Zauważ, że każde repozytorium może mieć różne sposoby dostarczania pożądanego artefaktu, więc pokażę dla dobrze zachowującego się, takiego jak atom .

Uzyskaj nazwy opublikowanych zasobów

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
...

Uzyskaj adres URL pobierania dla wybranego zasobu

Poniżej atom-mac jest moim pożądanym zasobem za pośrednictwem jqselect(.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

Pobierz artefakt

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

jq Playground

składnia jq może być trudna. Oto plac zabaw do eksperymentowania z jqpowyższym: https://jqplay.org/s/h6_LfoEHLZ

Bezpieczeństwo

Powinieneś podjąć kroki w celu zapewnienia poprawności pobranego artefaktu za pośrednictwem sha256sum i gpg , jeśli to w ogóle możliwe.

Mike D.
źródło
7

Rozwiązanie wykorzystujące (wewnętrzny) wget do pobrania zawartości HTML, przefiltruj ją pod kątem pliku zip (za pomocą egrep), a następnie pobierz plik zip (z zewnętrznym wgetem).

wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)
Rolf
źródło
6

Po prostu użyj jednego z poniższych adresów URL, aby pobrać najnowszą wersję: (na przykład adresy URL z projektu boxbilling): https://api.github.com/repos/boxbilling/boxbilling/releases

Pobierz najnowszą wersję jako zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Pobierz najnowszą wersję jako tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Kliknij jeden z adresów URL, aby natychmiast pobrać najnowszą wersję. Jak napisałem te linie, jest to obecnie: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

AKTUALIZACJA: Znalazłem inny adres URL w moich plikach dziennika (patrz przykład powyżej) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Lahmizzar
źródło
4
to są
repozytoria, a
5

Niemożliwe zgodnie z obsługą GitHub od 23.05.2018

Skontaktowałem się z [email protected] w dniu 2018-05-23 z wiadomością:

Czy możesz po prostu potwierdzić, że obecnie nie ma innego wyjścia niż majstrowanie przy API?

a oni odpowiedzieli:

Dziękuję za wiadomość. Zalecamy użycie interfejsu API do pobrania najnowszej wersji, ponieważ to podejście jest stabilne, udokumentowane i nie podlega zmianom w najbliższym czasie:

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

Będę to również śledził pod adresem : https://github.com/isaacs/github/issues/658

Rozwiązanie w Pythonie bez żadnych zależności

Solidny i przenośny:

#!/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'])

Zobacz też:

Weź również pod uwagę wersje wstępne

/latestnie widzi wersji wstępnych, ale jest to łatwe, ponieważ /releasesnajpierw wyświetla najnowszą:

#!/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'])
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
3

Strona pomocy z linkami do wydań wspomina o przycisku „Najnowsza wersja”, ale to nie daje linku do pobrania.

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

W tym celu musisz najpierw pobrać najnowszy tag (jak wspomniano w sekcjiAdres URL GitHub najnowszej wersji pliku do pobrania ? ”):

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

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip
VonC
źródło
2
To nadal wymaga wypychania nowej wersji gh-pagesgałęzi za każdym razem, gdy jest tworzone nowe wydanie; celem jest posiadanie statycznego linku, którego mogę użyć do „odesłania do najnowszej wersji”. W tej chwili moją najlepszą opcją jest odnieść się do strony z wydaniami.
Christian Rondeau
@ChristianRondeau Zgadzam się. Nigdzie w API nie znalazłem sposobu bezpośredniego odniesienia do pełnego adresu URL archiwum wersji „najnowszej”.
VonC
Mimo to dziękuję za wskazówkę; jeśli nie dostaniesz lepszych odpowiedzi, prawdopodobnie skończę z wykonaniem skryptu, aby zaktualizować strony gh za pomocą twojego skryptu.
Christian Rondeau
2

w PHP - przekierowanie do pobrania najnowszej wersji. Po prostu umieść na swojej przestrzeni internetowej

<?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);
Alex
źródło
2

Jeśli chcesz użyć tylko curl, możesz spróbować z -w '%{url_effective}'tym, że drukuje adres URL po łańcuchu przekierowań (po którym następuje curl, jeśli wywołasz go za pomocą -L). Na przykład

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

wyjścia https://github.com/github-tools/github/releases/tag/v3.1.0.

Mapio
źródło
2

Github obsługuje teraz statyczne linki do pobierania pojedynczych plików z najnowszej wersji: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Kaloyan Raev
źródło
Ta sama odpowiedź została już opublikowana 6 miesięcy wcześniej: stackoverflow.com/questions/24987542/…
wisbucky
Dzięki za zwrócenie mojej uwagi na to @wisbucky, odrzuciłem to, ponieważ brzmiało to jak niestandardowa implementacja od programisty, a nie kogoś ze StackOverflow!
Christian Rondeau
2

Podobnie jak większość osób odwiedzających to pytanie, byłem absolutnie sfrustrowany znalezieniem sposobu na pełne zautomatyzowanie pobierania najnowszej wersji wydania lub repozytorium w Github. Zaletą tego rozwiązania jest to, że nie musisz określać żadnego wydania ani numeru tagu - po prostu pobierze NAJNOWSZE .

Przeprowadziłem testy przy użyciu następującego użytkownika i repozytorium Github:

" f1linux " = Użytkownik Github
" pi-ap " = Repozytorium

Dowolna nazwa katalogu, w którym repozytorium jest zapisywane, jest ustawiana w:

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

BEZPOŚREDNI:

Używając narzędzi „ Web Developer ” przeglądarki Firefox (3 paski w prawym górnym rogu), w sekcji „ Sieć ” znalazłem https://api.github.comprzekierowanie do https://codeload.github.com, więc przesyłając potokiem curldo tar, mogłem pobrać najnowsze wersje repozytorium i zapisać je pod przewidywalną nazwą, można go operować na:

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

POŚREDNI:

Po osiągnięciu w pełni zautomatyzowanego pobierania najnowszej wersji wersji przy użyciu DIRECT URL, zwróciłem uwagę na osiągnięcie tego samego w przypadku przekierowania Githuba:

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

Preferowana metoda:

Należy jednak pamiętać, zgodnie z komentarzem Vona poniżej, że metodą preferowaną jest POŚREDNI

Dalsza walidacja:

Aby upewnić się, że moje wyniki są powtarzalne w innych repozytoriach Github z wersjami, te same testy zostały pomyślnie przeprowadzone dla doctlzestawu narzędzi API Digital Ocean (od czego właściwie rozpoczęło się całe ćwiczenie!):

Zarówno BEZPOŚREDNI, jak i POŚREDNI działają przy użyciu tego samego formularza co powyżej, po prostu zmieniając nazwę użytkownika i repozytorium:

BEZPOŚREDNI:

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

POŚREDNI:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1
F1Linux
źródło
Ciekawy. Głosowano za. Nie wiedziałem o ładowaniu kodu, chociaż korzystanie z API jest nadal zalecane: stackoverflow.com/a/60198721/6309
VonC
Początkowo miałem żal z powodu przekierowania i jak wspomniano w odpowiedzi, narzędzia „Web Developer” Firefoksa pomogły mi pójść właściwą drogą. Nie mogłem jednak na tym poprzestać, musiałem go uruchomić z przekierowaniem. Dziękuję za uznanie - bardzo zobowiązany!
F1Linux
1
@VonC Właśnie dodałem Twoją opinię do odpowiedzi. Byłem tego całkowicie nieświadomy. Dzięki za zwrócenie uwagi!
F1Linux
1

Chcę pobrać wydania z README.mdpliku w opisie repozytorium. Tam nie mogę wykonać JavaScript.

Mogę dodać takie linki do pliku README lub stron github dla wszystkich moich repozytoriów:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Pobiera najnowszy plik wydania z repozytorium.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    To działa, ponieważ strona odsyłająca JavaScript jest ustawiona, a repozytorium do pobrania jest określane za pomocą document.referrer. W ten sposób łącze będzie działać również w przypadku wideł.

Możesz znaleźć kod źródłowy tutaj , rozwidlić lub po prostu skorzystać z mojego repozytorium.

Użytkownik
źródło
1
To całkiem sprytny pomysł :) nie zadziała podczas udostępniania linków, używania curl lub polubień, ale ten pomysł można zrobić na stronach github projektu.
Christian Rondeau
1
Ponieważ jest to możliwe w przypadku witryny JavaScript, można również napisać usługę, która wykonuje przekierowanie. download-service.com/organization/repository/artifact
Użytkownik
0

W przypadku, gdy repozytorium używa tylko tagów zamiast wydania - por. jQuery - nie działają rozwiązania oparte o jeden URL.

Zamiast tego musisz sprawdzić wszystkie tagi, posortować je i utworzyć adres URL pobierania. Zaimplementowałem takie rozwiązanie dla języka Go i repozytorium jQuery: Link to Github .

Może to komuś pomoże.

SommerEngineering
źródło