如何使用命令行从私有GitHub仓库下载单个原始文件?

124

在CI服务器上,我想获取我们在Github上维护的配置文件,以便它可以在许多作业之间共享。 我正在尝试通过curl获取此文件,但以下两种方法都失败了(我收到了404错误):

# As advised by the oAuth docs
curl -H 'Authorization: token the_token' -L -o setup.sh https://raw.github.com/org/repo/file

# The url of the raw file after clicking to view it
curl -L https://raw.github.com/org/repo/file?login=username&token=the_token 
20个回答

2
当URL重定向到Amazon S3时,我遇到了身份验证错误:

只允许一种身份验证机制; 只有X-Amz-Algorithm查询参数...

对我有用的是将Authorization: token X标头更改为?access_token=<token>查询参数。

2
对于 GitHub Enterprise 和 API v3,我的 Bash 解决方案如下(包括 TOKEN 清理/隐私保护):
TOKEN=yourTokenHere; history -d $((HISTCMD-1)) > /dev/null

curl -H "Authorization: token $TOKEN" \
  -H 'Accept: application/vnd.github.v3.raw' \
  -o file.ext \
  -L http://github.company.com/api/v3/repos/[org]/[repo]/contents/path/file.ext?ref=[branch]

unset TOKEN

2

1
管理员的提示让我解决了问题。否则我只会收到404错误页面。 - Dave
在我的私有存储库上能够正常工作的最小权限集是 repoadmin:org/read:org - rlat

1
我们经常需要从私有GitHub仓库下载文件,但是简单的shell脚本并不能完全满足需求。因此,我们创建了fetch,这是一个开源的跨平台工具,可以轻松地从公共和私有GitHub仓库的git标签、提交或分支中下载源文件和发布资产。
例如,要从私有GitHub仓库的版本0.1.3中下载文件baz到/tmp目录,您需要执行以下操作:
GITHUB_OAUTH_TOKEN="your token"
fetch --repo="https://github.com/foo/bar" --tag="0.1.3" --source-path="/baz" /tmp

1

补充一下已接受的答案,如果您正在使用Github Enterprise,则url略有不同:

curl -H 'Authorization: token [your token]' \
-H 'Accept: application/vnd.github.v3.raw' \
-L https://[your domain]/api/v3/repos/[owner]/[repo-name]/contents/[path of file]

0

我认为发放一个个人访问令牌,即使只是为了从我的私有代码库中下载一个文件,也是一种有些危险而且不好的方式。

如何操作 -

我建议使用带有单个文件令牌的URL。不用担心,令牌字符串将由GitHub自动生成。你可以在源代码页面上获取此URL。

  1. 通过curl或wget等方式转到要下载的源代码页面
  2. 找到“raw”按钮并点击它。 enter image description here
  3. 打开新页面,然后只需复制该URL。此URL看起来像下面这样:
    (https://raw.githubusercontent.com/USERNAME/REPONAME/BRANCHNAME/FILENAME?token=TOKENSTRING).
  4. 您可以使用此URL下载文件

5
请注意,该网址附带的令牌会在一定天数后失效(详见https://github.community/t/token-expiration-on-urls-to-private-repos/2958),因此您不能在生产代码中真正使用此解决方案。 - V. Rubinetti
2
此外,似乎每个文件的令牌都不同。 - Akash Agarwal
我觉得这个令牌似乎过期得更快了。我一天刷新多次,所以这真的不是一个可行的解决方案。 - James
“所以这并不是一个可行的解决方案”,这取决于您的使用情况。如果令牌可能会泄露给公众,那么“我认为这是一种有点危险且不好的方式来发放个人访问令牌,即使只是从我的私人存储库下载单个文件也可以访问所有存储库”是完全合理的。 - xpt

0
很多答案都建议使用curl并提供自己的Authorization: Bearer **** 头,或者使用GitHub CLI(gh)来获取预经过身份验证的下载URL,然后使用那个URL与curl进行操作。 但是,gh支持自定义标头,因此您可以使用单个请求使用gh完成此操作:
gh api "/repos/:owner/:repo/contents/README.md" -H "Accept: application/vnd.github.raw" > README.md

如何使用GitHub CLI获取预授权的下载URL? - undefined

-1

我尝试了一个简单的技巧,在Pycharm和Colab中打开GitHub上的私有.iypnb文件,并且对我来说效果很好。

  1. 按下Raw按钮获取你的.ipynb文件的原始文本,会打开一些类似这样的文本。
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": []
}]
}

2. 在操作系统(例如Windows)上打开记事本/文本编辑器,将所有文本复制到一个新的记事本文件中。 3. 另存记事本为name.ipynb而不是name.txt,并将保存类型更改为所有文件(.*)而不是文本文档(*.txt)。 4. 最后在您的IDE或Colab中打开文件。

-3
以下应该可以正常工作。在您的分支名称(在此例中是主分支)之前加上一个“原始”。

curl -L -O https://github.com/your/repo/raw/master/fetch_file.sh


6
这个问题是关于私有代码仓库的。 - user2561747

-5

你可以使用原始链接来实现这个。

curl -O https://raw.githubusercontent.com/owner/repo/branchname/path/to/file

7
问题是关于私有仓库的。 - Adam B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接