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

在 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
136774 次浏览

我为此纠结了几分钟,直到我意识到所需要做的就是将 url 包装成引号以避免与号。

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

这招对我的私人回购很管用。

或者,如果你没有代币:

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

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

您可以使用 V3API 获得这样的原始文件(您将需要一个 OAuth 令牌) :

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

All of this has to go on one line. The -O option saves the file in the current directory. You can use -o filename to specify a different filename.

To get the OAuth token follow the instructions here:

我把这个也写成了一个要点:

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

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

只允许一种认证机制; 只允许 X-Amz-Algorithm查询参数..。

Authorization: token X头改为 ?access_token=<token>查询参数对我来说很有用。

我知道这是一个老问题,但上面提出的解决方案对我都不管用。也许从那时起 API 已经发生了变化。

这个方法奏效了:

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

您可以使用原始链接来完成此操作。

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

我们不得不经常从私有的 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

或者,您可以使用 github“ personal access token”(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
....

下面应工作良好。一个“原始”在您的分支名称(主人在这种情况下)。

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

如果你使用的是 Github 企业网址,那么这个问题的答案只是稍微有些不同:

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]
  1. 在浏览器中打开您的 github 回购: 点击文件
  2. 在浏览器中打开开发工具: 选择网络选项卡
  3. 在浏览器 github 中: 点击下载按钮
  4. 关闭弹出窗口
  5. 在浏览器开发工具中: 右键单击列表 file_name?token=ABAHQCAT6KG...
  6. 选择 copy-> copy link address

    网址格式如下:

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

  7. in terminal:

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

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

令人惊讶的是,在我找到解决办法之前,没有一个答案对我不起作用。

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

注意: 在创建令牌时,必须检查管理权限。请参阅相关问题

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

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

因此,如果原始文件的 URL (登录时)是

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

For GitHub Enterprise and API v3, my bash solution looked like this (includes TOKEN cleanup / privacy):

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

我认为发布一个个人访问令牌有点危险,而且不是一个好办法,因为它可以访问所有存储库,即使只是为了从我的私有存储库下载一个文件。

怎么...

I would love to recommend using url with token for single file. Don't worry. The token string will generated by github automatically. You can get this url on your source code page.

  1. 进入源代码页,你想通过 curl 或 wget 等下载什么
  2. 找到“原始”按钮并单击它。 enter image description here
  3. 打开新页面,只需复制网址。这个网址看起来如下:
    (https://raw.githubusercontent.com/USERNAME/REPONAME/BRANCHNAME/FILENAME?token=TOKENSTRING).
  4. 您可以使用此 URL 下载文件

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

  1. 你必须先登入:
gh auth login

For me, this command is not required since I'm already logged in.

  1. 然后我们需要针对该文件的 API URL 来下载,并调用 gh将其转换为经过认证的下载 URL:
API_URL=https://api.github.com/repos/owner/repo/contents/path/file.ext
curl $(gh api $API_URL --jq .download_url) -o file.ext

An real example is maybe better. Here it is to download Install _ linux. md from gh cli:

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

API_URL:

  • 用户 ownercli
  • 存储库名称 repo也是 cli
  • 到文件的路径(path/file.ext)是 docs/install_linux.md

我能够让它为 github 企业工作,感谢上面的建议。我不得不接受你所有的建议,努力尝试,最终我成功了。以下是我实现目标的步骤。

  1. 创建个人令牌,遵循以下步骤:

Https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token

  1. 请确保您具有最低下列权限的令牌:

    • 回购 (选择所有在回购项下)
    • Admin: org-> read: org (在“ admin: org”下选择“ read: org”) enter image description here
  2. 使用以下 curl 命令获取内容:

curl -H "Authorization: token [yourPersonalToken]" -H "Accept: application/vnd.github.v3.raw" -o [filePath]-content.json -L https://github.[company].com/api/v3/repos/[ORG]/[REPO_NAME]/contents/[PATH_TO_FILE]/content.json?ref=[BRANCH_NAME]

在哪里

 [yourPersonalToken] is the token you created.
[filePath] is a path where you want to save the downloaded copy.
[company] is the name of company which hosted the github enterprise.
[ORG] is the github organization is which repo is created.
[REPO_NAME] is the name of the repository.
[PATH_TO_FILE] is the path where file is located.
[BRANCH_NAME] is the name of the branch you want to use, e.g. master, develop etc.

例如:

curl -H "Authorization: token 5a86ecda9ff927baaa66fad2af5bee8" -H "Accept: application/vnd.github.v3.raw" -o C:\Downloads\manifest.json -L https://github.example.com/api/v3/repos/cms/cms_one/contents/app/data/manifest.json?ref=master

我尝试了一个简单的技巧来打开一个 GitHub 私有服务。Iypnb 文件在 Pycharm 以及 Colab 和它工作得很好。

  1. get raw text for your .ipynb file by pressing Raw button this will open 像这样的短信。
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": []
}]
}
  1. 在 OS 上打开记事本/文本编辑器(例如 windows)将所有文本复制到一个新的记事本文件中。

  2. 将记事本保存为 name.ipynb 而不是 name.txt 保存为文件类型 All Files (.)而不是 Text Document (* . txt)

  3. 最后在 IDE 或 colab 中打开文件。

我有一个应用程序安装的令牌。

以前,您可以使用查询 ?access_token=MY_TOKEN,但是它是 已弃用,并于2021年9月移除

在他们关于 使用 GitHub 应用程序进行身份验证的文档中,他们说你可以用访问令牌和 URL 中的用户名 x-access-token克隆一个回购协议。

这似乎也适用于下载原始文件(ghs_...是令牌) :

$> curl "https://x-access-token:ghs_4qgGKx4skAcaF3bAb3scrTkN4@raw.githubusercontent.com/Octocat/codertocat/main/README.md"