如何通过命令行从私有 GitHub 仓库下载文件

如何通过命令行从私有 GitHub 仓库下载文件

我想找到一种更简单的方法来从私有 GitHub 存储库中获取文件。

我设法通过在 GitHub 上创建个人访问令牌来下载文件curl,然后像这样使用它:

curl https://[email protected]/accountName/repoName/branchName/fileName.txt

这对我来说很有效,但是我想知道是否有更简单的方法,也许使用 SSH?我不介意输入我的 SSH 密码,因为它似乎比创建访问令牌更方便。我已经可以在 GitHub 上成功进行身份验证:

$ ssh -T [email protected]
# Attempts to ssh to GitHub

但是,当我尝试使用curlSSH 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 访问令牌,如何创建它:

  1. 前往 github.com,点击右上角的个人资料图片
  2. 向下滚动并单击显示的侧栏上的设置
  3. 向下滚动并单击左侧边栏上的开发人员设置
  4. 点击个人访问令牌(菜单栏)
  5. 点击代币(经典)
  6. 然后点击生成新令牌(菜单栏)
  7. 然后点击生成新令牌(经典)
  8. 写下 token 的信息(名称、有效期)并小心!允许页面上显示的所有访问!如果不这样做,API 将无法工作
  9. 复制你的 API 密钥
  10. 使用您复制的令牌编写此代码
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)

我希望这可以帮助你

相关内容