如何使用命令行从私有github存储库中下载单个原始文件?


75

在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 

Answers:


108

先前的答案不起作用(或不再起作用)。

您可以使用V3 API获取这样的原始文件(您需要OAuth令牌):

curl -H 'Authorization: token INSERTACCESSTOKENHERE' \
  -H 'Accept: application/vnd.github.v3.raw' \
  -O \
  -L https://api.github.com/repos/owner/repo/contents/path

所有这些必须合而为一。该-O选项将文件保存在当前目录中。您可以-o filename用来指定其他文件名。

要获取OAuth令牌,请按照此处的说明进行操作:

我也将其写成要点:

编辑:解决方案的API参考如下:


3
请注意,如果文件是公共文件,则不需要授权令牌:curl -H 'Accept: application/vnd.github.v3.raw' https://api.github.com/repos/owner/repo/contents/path将返回原始文件。
阿尔夫·伊顿

-H 'Accept: application/vnd.github.v3.raw'必要吗?我可以访问没有该部分的私人文件。
Nick Chammas 2015年

2
@NickChammas:如果没有该标头,我将获得一个JSON响应,其中包含元数据和以base64编码的实际文件内容,而不是以纯文本格式显示的文件。
c24w

如果上面的命令将错误显示为curl,该怎么办:(56)代理CONNECT中止了这是什么意思。
最多

@thomasfuchs我错过了一些明显的文件路径。您可以在命令中明确定义一个无害的README.md文件进行演示吗?
anon58192932 '16

27

另外,您可以使用github“个人访问令牌”(https://github.com/settings/tokens):

TOKEN=...
curl -s https://$TOKEN@raw.githubusercontent.com/<user or organization>/<repo name>/<branch>/<path to file>/<file_name>

例:

$ curl -s https://1bacnotmyrealtoken123beefbea@raw.githubusercontent.com/concourse/concourse/master/README.md
....

1
@ EM0-我刚刚尝试过,它起作用了。需要仔细检查的几件事:1.主机部分是raw.githubusercontent.com2.路径是<username>/<repo name>/<branch>/<file name>3.令牌需要具有repo访问范围。
theartofrain,2016年

是的,这就是路。我从文件的“下载”链接中获取路径,但从末尾剥离了“?token = ...”并添加了令牌。它确实具有回购访问范围,但这仅涉及公共存储库。这是一个组织专用存储库。另外,我们启用了2因子身份验证,但是我认为如果是这个问题,应该给出错误401,而不是
404。– EM0

是的,这听起来不错。路径听起来不错(这是我单击“原始”时获得的路径,剥去了?token=...参数,就像您说的那样)。我的用户也具有2因子身份验证,我假设我们正在谈论相同的令牌范围(github.com/settings/tokens/newrepo上的复选框)。对于它的价值,如果令牌无效或没有作用域,您将得到404(而不是401)。不知道为什么这在您的设置中repo
不起作用

3
奇怪的事情:对我来说,使用curl上面的命令有效,但是,如果我在浏览器中打开相同的链接或尝试通过请求它java.net.URL.openStream,则会得到404 ...
Nightscape

1
这是我可以使其在CMD中的内部GitHub实例上运行的唯一方法。curl -H 'Authorization: token $TOKEN' $file_url在我身上总是使用404。我不确定为什么一个可行,而其他却不可行,但是我从未深入探讨CURL的文档。
kayleeFrye_onDeck

11

我知道这是一个古老的问题,但是以上提出的解决方案都不适合我。此后,API可能已更改。

这工作:

curl -H 'Authorization: token [insert your token here]' -o output.txt https://raw.githubusercontent.com/[organization]/[repo]/[branch]/[path to file]


这也是唯一为我工作的人,但是您的答案有一个小错字。它应该是[organization]/[repo]/[branch]...
anon58192932 '17

谢谢,只有对我有用的东西才能在Github Enterprise上使用。请注意,所需的令牌是个人访问令牌。
奥利弗·皮尔曼

您尝试过@OliverPearmaincurl -s https://PAT_VALUE@raw.github.company.com/OrgOrUser/RepoName/BranchOrCommitID/file_name.file_extension吗?那是我唯一可以工作的东西,但是公司中的其他人却改用了该解决方案,因此我认为对于CURL可能会有某种配置,从而可以减少使用限制curl -s...而不是使用此CLI参数集的限制。
kayleeFrye_onDeck

6

或者,如果您没有令牌:

curl --user [your_user] 'https://raw.github.com/path/to/file.config' > file.config

1
有人问我输入密码,但反应始终是一个404
让·乔丹

同样在这里:总是404
安德烈·路易斯·

5

我花了几分钟的时间为此苦苦挣扎,直到我意识到所需要的只是将URL括在引号中以逃避&符。

curl "https://raw.github.com/org/repo/file?login=username&token=the_token"

在我的私人回购中对我有用。


2

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

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

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


2

只是接受的答案的补充,如果您使用的是Github Enterprise网址,则略有不同:

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]

2
  1. 在浏览器中打开您的github存储库:单击文件
  2. 在浏览器中打开开发人员工具:选择“网络”选项卡
  3. 在浏览器github中:单击下载按钮
  4. 关闭弹出窗口
  5. 在浏览器开发工具中:右键单击具有以下内容的列表 file_name?token=ABAHQCAT6KG...
  6. 选择复制->复制链接地址

    网址的格式为:

    https://raw.githubusercontent.com/<USERNAME>/<PATH>/<FILENAME>?token=ABAHQCAT6KGHYHMG2SLCDT243PH4I

  7. 在终端:

    wget -O myFilename https://raw.githubusercontent.com/<USERNAME>/<PATH>/<FILENAME>?token=ABAHQCAT6KGHYHMG2SLCDT243PH4I

链接仅在有限的时间内有效,或者您可以创建令牌:GitHub文章


1

我们不得不经常从私有GitHub存储库下载文件,而且骇人的shell脚本并不能很好地解决这个问题,因此我们创建了fetch,这是一个开放源代码,跨平台的工具,可以轻松地从a git标签,commit或公共和私有GitHub存储库的分支。

例如,要将文件baz0.1.3私有GitHub存储库版本下载到/tmp,您可以执行以下操作:

GITHUB_OAUTH_TOKEN="your token"
fetch --repo="https://github.com/foo/bar" --tag="0.1.3" --source-path="/baz" /tmp

1

令人惊讶的是,直到找到解决方法,所有答案都对我没有用。

您可以使用@thomasfuchs回答的个人访问令牌https://github.com/settings/tokens

注意:创建令牌时,必须检查管理员权限。见相关问题

https://github.com/octokit/octokit.net/issues/1812


1
管理员提示使其对我有用。否则,我刚刚收到一个404
戴维戴维

使它适合我的私人回购协议的最低权限为repoadmin:org/read:org
拉特

0
curl -H 'Authorization: token YOUR_TOKEN' \
  -H 'Accept: application/vnd.github.v4.raw' \
  -O \
  -L https://api.github.com/repos/INSERT_OWNER_HERE/INSERT_REPO_HERE/contents/PATH/TO/FILE

因此,如果原始文件的网址(登录时)为

https://raw.githubusercontent.com/mr_coder/my_repo_name/master/my_script


Then 
  -L https://api.github.com/repos/INSERT_OWNER_HERE/INSERT_REPO_HERE/contents/PATH/TO/FILE
becomes
  -L https://api.github.com/repos/mr_coder/my_repo_name/contents/my_script

注意:我们有API v4


0

对于GitHub Enterprise和API v3,我的bash解决方案如下所示(包括令牌清除/隐私):

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

0

我认为这是发行个人访问令牌的一种危险方式,不是一个好方法,该令牌可以访问所有存储库,甚至只是从我的私人存储库下载单个文件。

如何 -

我想建议对单个文件使用带有令牌的url。不用担心 令牌字符串将由github自动生成。您可以在源代码页面上获得此URL。

  1. 转到源代码页面,您要通过curl或wget等下载的内容
  2. 找到“原始”按钮,然后单击它。 在此处输入图片说明
  3. 新页面打开,只需复制URL。该网址如下所示:
    https://raw.githubusercontent.com/USERNAME/REPONAME/BRANCHNAME/FILENAME?token=TOKENSTRING)。
  4. 您可以使用此网址下载文件

0

恕我直言,更简单的解决方案是使用Official GitHub CLI gh

  1. 首先,您必须登录:
gh auth login

对我来说,此命令不是必需的,因为我已经登录了。

  1. 然后,我们需要将文件定位到API URL。并致电gh将其转换为经过身份验证的下载网址:
API_URL=https://api.github.com/repos/owner/repo/contents/path/file.ext
curl $(gh api $API_URL | jq -r .download_url) -o file.ext

一个真实的例子也许更好。这里是从cli下载install_linux.mdgh

API_URL=https://api.github.com/repos/cli/cli/contents/docs/install_linux.md
curl $(gh api $API_URL | jq -r .download_url) -o install_linux.md

API_URL

  • 用户ownercli
  • 库名称repocli
  • 文件(path/file.ext)的路径为docs/install_linux.md

-3

下面应该可以正常工作。分支名称(在此情况下为主名称)前的“原始”。

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


5
这个问题是关于私人
仓库的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.