Comment télécharger la version Github de private repo en utilisant la ligne de commande

GitHub guide explique 2 façon d'Autoriser mais ne regarde aucun de ces travaux avec les fichiers de publication.

à la suite de:

curl -u 'username' -L -o a.tgz https://github.com/company/repository/releases/download/TAG-NAME/A.tgz

il y a toujours quelque chose comme

<!DOCTYPE html> <!-- Hello future GitHubber! ...

23
demandé sur mana 2013-12-05 13:36:52

7 réponses

pour télécharger le fichier release à partir de private repo, vous pouvez utiliser Personal access token qui peut être généré à paramètres/jetons avec contrôle total des dépôts privés scope.

télécharger ensuite le bien avec la commande curl (changer avec les valeurs appropriées):

curl -vLJO -H 'Accept: application/octet-stream' 'https://api.github.com/repos/:owner/:repo/releases/assets/:id?access_token=:token'

où:

  • :owner est votre utilisateur ou organisation nom d'utilisateur;
  • :repo est le nom de votre dépôt;
  • :id est votre identifiant de bien, peut être trouvé dans L'URL de publication de tag, comme:

    https://api.github.com/repos/:owner/:repo/releases/tags/:tag 
    
  • :token est votre token d'accès personnel (peut être créé à /settings/tokens ;

voir: dépôts API v3 at GitHub


voici le script Bash qui peut télécharger le fichier d'actif à nom de fichier spécifique:

#!/usr/bin/env bash
# Script to download asset file from tag release using GitHub API v3.
# See: http://stackoverflow.com/a/35688093/55075    
CWD="$(cd -P -- "$(dirname -- ""151920920"")" && pwd -P)"

# Check dependencies.
set -e
type curl grep sed tr >&2
xargs=$(which gxargs || which xargs)

# Validate settings.
[ -f ~/.secrets ] && source ~/.secrets
[ "$GITHUB_API_TOKEN" ] || { echo "Error: Please define GITHUB_API_TOKEN variable." >&2; exit 1; }
[ $# -ne 4 ] && { echo "Usage: "151920920" [owner] [repo] [tag] [name]"; exit 1; }
[ "$TRACE" ] && set -x
read owner repo tag name <<<$@

# Define variables.
GH_API="https://api.github.com"
GH_REPO="$GH_API/repos/$owner/$repo"
GH_TAGS="$GH_REPO/releases/tags/$tag"
AUTH="Authorization: token $GITHUB_API_TOKEN"
WGET_ARGS="--content-disposition --auth-no-challenge --no-cookie"
CURL_ARGS="-LJO#"

# Validate token.
curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or network issue!";  exit 1; }

# Read asset tags.
response=$(curl -sH "$AUTH" $GH_TAGS)
# Get ID of the asset based on given name.
eval $(echo "$response" | grep -C3 "name.:.\+$name" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')
#id=$(echo "$response" | jq --arg name "$name" '.assets[] | select(.name == $name).id') # If jq is installed, this can be used instead. 
[ "$id" ] || { echo "Error: Failed to get asset id, response: $response" | awk 'length("151920920")<100' >&2; exit 1; }
GH_ASSET="$GH_REPO/releases/assets/$id"

# Download asset file.
echo "Downloading asset..." >&2
curl $CURL_ARGS -H 'Accept: application/octet-stream' "$GH_ASSET?access_token=$GITHUB_API_TOKEN"
echo ""151920920" done." >&2

avant de courir, vous devez régler votre GITHUB_API_TOKEN avec votre jeton GitHub (voir: /settings/tokens à GH). Cela peut être placé dans votre fichier ~/.secrets , comme:

GITHUB_API_TOKEN=XXX

exemple d'utilisation du script:

./get_gh_asset.sh :owner :repo :tag :name

où nom est votre nom de fichier (ou une partie de celui-ci). Préfixe script avec TRACE=1 pour le déboguer.


dans le cas où vous vous demandez pourquoi curl échoue parfois avec (comme mentionné dans une autre réponse):

un seul mécanisme d'auth est autorisé; seul le paramètre de requête X-Amz-Algorithm , le paramètre de chaîne de requête de Signature ou l'en-tête Authorization doivent être spécifiés.

quand on court comme:

curl -vLJ -H 'Authorization: token <token>' -H 'Accept: application/octet-stream' https://api.github.com/repos/:owner/:repo/releases/assets/<id>

c'est parce que vous spécifiez plusieurs mécanismes en même temps, donc le serveur S3 ne sait pas lequel utiliser, donc vous devez en choisir un seul, comme:

  • X-Amz-Algorithm paramètre de requête
  • paramètre de chaîne de requête de Signature ( X-Amz-Signature )
  • en-tête D'autorisation ( Authorization: token <token> )

et puisque GitHub vous redirige de la page de l'actif (lors de la demande application/octet-stream ), il popule les informations d'identification automatiquement dans la chaîne de requête et puisque curl passe les mêmes informations d'identification dans l'en-tête de requête (que vous avez spécifié), elles sont donc contradictoires. Pour contourner le problème, vous pouvez utiliser access_token à la place.

23
répondu kenorb 2018-06-18 04:40:05

semble que les deux méthodes d'authentification ne fonctionnent que pour les paramètres API. Il y a un paramètre API pour le téléchargement des actifs de version ( docu ):

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

mais il faut connaître L'identification numérique du bien pour ça. J'ai demandé à leur support s'ils pouvaient ajouter un endpoint D'API pour télécharger les ressources de release par leur nom (comme ils ont pour tarballs).


mise à jour: réponse de GitHub support:

nous n'offrons pas D'API comme vous le suggérez. Nous essayons d'éviter les URLs cassantes qui changeraient si l'étiquette ou le nom de fichier de l'actif de publication change. Je transmettrai vos commentaires à l'équipe pour en discuter.

9
répondu njam 2015-10-14 22:13:37

nous avons dû télécharger assez souvent des ressources de publication depuis des repos GitHub privés, donc nous avons créé fetch , qui est un outil open source, multiplateforme qui rend facile de télécharger des fichiers source et de publier des ressources à partir d'une étiquette git, d'un commit ou d'une branche de repos GitHub publics et privés.

par exemple, pour télécharger la version foo.exe de la version 0.1.3 d'une GitHub repo privée à /tmp , vous feriez ce qui suit:

GITHUB_OAUTH_TOKEN="your token"
fetch --repo="https://github.com/foo/bar" --tag="0.1.3" --release-asset="foo.exe" /tmp
6
répondu Josh Padnick 2016-06-20 16:40:52

j'ai trouvé la réponse dans ce commentaire: https://github.com/request/request/pull/1058#issuecomment-55285276

curl transmet l'en-tête d'authentification de la requête au seau AmazonS3, où les actifs de publication Github sont stockés. Réponse d'erreur de S3:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
 <Code>InvalidArgument</Code>
 <Message>
   Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified
 </Message>
 <ArgumentName>Authorization</ArgumentName>
 <ArgumentValue>token <yourtoken> </ArgumentValue><RequestId>4BEDDBA630688865</RequestId> <HostId>SXLsRKgKM6tPa/K7g7tSOWmQEqowG/4kf6cwOmnpObXrSzUt4bzOFuihmzxK6+gx</HostId>
</Error>

Une ligne wget solution:

wget --auth-no-challenge --header='Accept:application/octet-stream' https://<token>:@api.github.com/repos/:owner/:repo/releases/assets/:id -O app.zip

Try: curl -i -H "Authorization: token <token>" -H "Accept:application/octet-stream" https://<token>:@api.github.com/repos/:owner/:repo/releases/assets/:id , pour certains plus de détails. Ajouter -L pour voir le message d'erreur S3.

5
répondu phedoreanu 2015-02-25 15:28:31

voici un "one-liner" utilisant wget pour faire des requêtes HTTP et python pour JSON parsing:

(export AUTH_TOKEN=<oauth-token>; \
 export ASSET_ID=$(wget -O - https://api.github.com/repos/<owner>/<repo>/releases/tags/<tag>?access_token=$AUTH_TOKEN | python -c 'import sys, json; print json.load(sys.stdin)["assets"][0]["id"]'); \
 wget --header='Accept:application/octet-stream' -O <download-name> https://api.github.com/repos/<owner>/<repo>/releases/assets/$ASSET_ID?access_token=$AUTH_TOKEN)

pour l'utiliser, il suffit de remplacer <oauth-token> , <owner> , <repo> , <tag> et <download-name> avec les valeurs appropriées.

explication:

  • la première déclaration ( export AUTH_TOKEN=<oauth-token> ) fixe GitHub OAuth token qui est utilisé par la suite wget des commandes.
  • la deuxième déclaration a deux parties:
    1. la wget -O - https://api.github.com/repos/<owner>/<repo>/releases/tags/<tag>?access_token=$AUTH_TOKEN part obtient les informations de libération de GitHub d'un nom d'étiquette et les imprime sur stdout .
    2. Le "1519110920 de la partie" analyse JSON de stdin et des extraits de la id de la (première) la libération de l'actif.
  • le troisième énoncé ( wget --header='Accept:application/octet-stream' -O <tarball-name>.tar.gz https://api.github.com/repos/<owner>/<repo>/releases/assets/$ASSET_ID?access_token=$AUTH_TOKEN) ) obtient un seul actif de libération GitHub par id et le stocke dans un fichier.
  • les parenthèses extérieures créent un sous-puits et s'assurent que les variables d'environnement exportées sont rejetées après.
4
répondu tjanez 2016-01-04 13:51:00

une solution plus facile à utiliser .netrc pour stocker les justificatifs d'identité. De cette façon, curl ne transmet pas les justificatifs D'identité à Amazon S3 Bucket

dans le fichier ~/.netrc (doit être créé avec la permission du fichier 0600):

machine api.github.com
login yourusername
password yourpassword

puis utiliser l'option curl-n à utiliser .netrc:

curl -L -O -J -n -H "Accept:application/octet-stream" https://api.github.com/repos/:owner/:repo/releases/assets/:id
3
répondu FF_Dev 2015-08-03 08:28:09

Voici curl & jq un;) liner:

CURL="curl -H 'Authorization: token <auth_token>' \
      https://api.github.com/repos/<owner>/<repo>/releases"; \
ASSET_ID=$(eval "$CURL/tags/<tag>" | jq .assets[0].id); \
eval "$CURL/assets/$ASSET_ID -LJOH 'Accept: application/octet-stream'"

changez les pièces entourées de <> avec vos données. Pour générer auth_token , passez à github.com/settings/tokens

si vous aimez vous connecter avec mot de passe Utilisez ceci (notez qu'il vous demandera le mot de passe deux fois):

CURL="curl -u <github_user> https://api.github.com/repos/<owner>/<repo>/releases"; \
ASSET_ID=$(eval "$CURL/tags/<tag>" | jq .assets[0].id); \
eval "$CURL/assets/$ASSET_ID -LJOH 'Accept: application/octet-stream'"
1
répondu tworec 2018-07-19 16:26:42