Cómo descargar tarball desde Github

Cómo descargar tarball desde Github

Tengo esto:

curl -L "https://github.com/cmtr/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"

Solo estoy intentando descargar un tarball de github y extraerlo a un directorio existente. El problema es que recibo este error:

Step 10/13 : RUN curl -L "https://github.com/channelmeter/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"
 ---> Running in a883449de956
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     9  100     9    0     0     35      0 --:--:-- --:--:-- --:--:--    35
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
The command '/bin/sh -c curl -L "https://github.com/channelmeter/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"' returned a non-zero code: 2

¿Alguien sabe por qué no es un archivo tar? Si va a github.com en el navegador e ingresa este patrón, descargará un archivo tar.gz:

https://github.com/<org>/<repo>/tarball/<sha>

así que no estoy seguro de por qué no funciona.

Respuesta1

En última instancia, es porque Github quiere credenciales. Sin autenticación de 2 factores, puedes hacer esto con curl:

curl -u username:password https://github.com/<org>/<repo>/tarball/<sha>

pero si tienes una configuración de autenticación de 2 factores, entonces necesitas usar un token de acceso de Github y debes usar api.github.com en lugar de github.com, así:

 curl -L "https://api.github.com/repos/<org>/<repo>/tarball/$commit_sha?access_token=$github_token" | tar -xz -C "$extract_dir/"

El token de acceso está documentado aquí: https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line

Respuesta2

Otro enfoque para esto es utilizar una cookie de GitHub. Todavía comienza con el usuario/contraseña normal, pero después de la solicitud inicial, puede realizar más solicitudes utilizando la cookie. Aquí hay un ejemplo con PHP:

<?php

# GET
$get = curl_init('https://github.com/login');
curl_setopt($get, CURLOPT_COOKIEJAR, 'github.txt');
curl_setopt($get, CURLOPT_RETURNTRANSFER, true);
$log = curl_exec($get);
curl_close($get);

# POST
preg_match('/name="authenticity_token" value="([^"]*)"/', $log, $auth);
$pf['authenticity_token'] = $auth[1];
$pf['login'] = getenv('USER');
$pf['password'] = getenv('PASS');
$post = curl_init('https://github.com/session');
curl_setopt($post, CURLOPT_COOKIEFILE, 'github.txt');
curl_setopt($post, CURLOPT_POSTFIELDS, $pf);
curl_exec($post);

Luego, después de eso, puedes usar Shell cURL con -b github.txto PHP cURL con CURLOPT_COOKIEFILE github.txt. Asegúrese de hacerlo curl_closecomo se muestra arriba; de lo contrario, el archivo de cookies se creará después de que sea necesario.

información relacionada