web-dev-qa-db-ja.com

Githubからtarballをダウンロードする方法

私はこれを持っています:

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

私はgithubからtarballをダウンロードして既存のディレクトリに抽出しようとしています。問題は私がこのエラーを受け取っていることです:

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

それがtarアーカイブではない理由を誰かが知っていますか?ブラウザーでgithub.comにアクセスしてこのパターンを入力すると、tar.gzアーカイブがダウンロードされます。

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

なぜそれが機能しないのかわからない。

2
Alexander Mills

つまり、最終的にはGithubが認証情報を必要としているためです。 2要素認証がなければ、curlでこれを行うことができます:

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

ただし、2要素の認証設定がある場合は、Githubアクセストークンを使用する必要があり、次のようにgithub.comではなくapi.github.comを使用する必要があります。

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

アクセストークンの事柄はここに文書化されています: https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line

3
Alexander Mills

これに対する別のアプローチは、GitHub Cookieを使用することです。それでも通常のユーザー/パスで開始されますが、最初のリクエストの後、Cookieを使用してさらにリクエストを行うことができます。 PHPの例を次に示します。

<?php

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

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

その後、-b github.txtまたはPHP cURL with CURLOPT_COOKIEFILE github.txtでShell cURLを使用できます。上記のようにcurl_closeを使用してください。それ以外の場合はCookieファイルは必要な後に作成されます。

2
Steven Penny