我想找到一种更简单的方法来从私有 GitHub 存储库中获取文件。
我设法通过在 GitHub 上创建个人访问令牌来下载文件curl
,然后像这样使用它:
curl https://[email protected]/accountName/repoName/branchName/fileName.txt
这对我来说很有效,但是我想知道是否有更简单的方法,也许使用 SSH?我不介意输入我的 SSH 密码,因为它似乎比创建访问令牌更方便。我已经可以在 GitHub 上成功进行身份验证:
$ ssh -T [email protected]
# Attempts to ssh to GitHub
但是,当我尝试使用curl
SSH URL 时,出现此错误:
curl ssh://[email protected]:accountName/repoName/branchName/fileName.txt
curl: (3) URL using bad/illegal format or missing URL
我尝试了描述的其他一些方法本文,但无济于事。
有任何想法吗?
答案1
首先,curl 说“格式错误/非法”,因为你混合使用了 URL 样式和 rsh 样式的地址格式。传统上,Git 接受git clone
,但只有后者:
在主机和路径之间放置 —— 而在 URL 中,所有路径都以 开头/
。例如,rsh/scp 样式的地址[email protected]:foo/bar
将写为 URL ,就像 HTTP URL 一样。ssh://[email protected]/foo/bar
SSH 本身并不是一个文件传输协议,它更像是 TLS,它可以携带各种文件传输协议,例如 SFTP 或 scp 或 rsync(与 TLS 可以承载 HTTP 非常相似)。为 curl 提供 URLssh://
毫无意义1,但您可以为其提供sftp://
URL 以通过 SFTP 检索文件。(请注意,您链接的文章也专门使用 SFTP。)
但是,GitHub 不提供 SFTP 访问;通过 SSH 连接到 GitHub 唯一允许的是 Git 协议。您无法使用 curl 访问它,只能使用git clone
。
因此,如果您必须使用 SSH,那么使用 GitHub 的唯一选择就是通过 Git 克隆存储库。(可以使用--depth=
或--filter=
选项减少下载大小,但最终仍然是整个存储库,而不仅仅是单个文件。)
1(Git 使用 ssh:// URL,但从上下文来看其含义很清楚 - 它是 Git 协议,但通过 SSH 建立隧道。Git 不使用 SFTP。)
答案2
首先你需要一个来自 github 的 API 访问令牌,如何创建它:
- 前往 github.com,点击右上角的个人资料图片
- 向下滚动并单击显示的侧栏上的设置
- 向下滚动并单击左侧边栏上的开发人员设置
- 点击个人访问令牌(菜单栏)
- 点击代币(经典)
- 然后点击生成新令牌(菜单栏)
- 然后点击生成新令牌(经典)
- 写下 token 的信息(名称、有效期)并小心!允许页面上显示的所有访问!如果不这样做,API 将无法工作
- 复制你的 API 密钥
- 使用您复制的令牌编写此代码
import requests
from requests.structures import CaseInsensitiveDict
GH_PREFIX = "https://raw.githubusercontent.com"
ORG = "GITHUB_USERNAME"
REPO = "YOUR_REPOSITORY_NAME"
BRANCH = "YOUR_REPOSITORY_BRANCH"
FOLDER = "THE_FOLDER_WHICH_INCLUDE_TEST.txt"
FILE = "THE_FILE_YOU_WANT_TO_ACCESS(TEST.txt)"
url = GH_PREFIX + "/" + ORG + "/" + REPO + "/" + BRANCH + "/" + FOLDER + "/" + FILE
headers = CaseInsensitiveDict()
headers["Authorization"] = "token " + "YOUR_API_ACCESS_TOKEN_HERE"
r = requests.get(url, headers=headers, stream=True)
first = str(r.content).replace("b'", "")
second = first.replace("\\r", "")
third = second.replace("\\n'", "")
result = third.replace("'", "")
print(result)
我希望这可以帮助你