如何从 GitHub 克隆所有存储库(包括私有存储库)?

2 git json curl github

我试图立即将所有存储库克隆到我的计算机上,所有这些存储库都是私有的。我尝试过无数的俏皮话和脚本(即,这里这里的),但它们都不起作用。

最初,我会收到有关 JSON 无法解析响应的错误,我最终意识到这是因为响应是空的,因为我没有公共存储库。当我创建一个测试公共存储库时,它将返回一个 JSON 对象,其中包含该特定存储库的信息,但没有任何私有存储库的信息。据我了解,我需要将我的用户名和访问令牌传递给 GitHub,其中访问令牌是在 生成的Settings > Developer settings > Personal access tokens

我尝试过以下两种格式均无效:

curl -i -u [[USERNAME]]:[[TOKEN]] -s https://api.github.com/users/[[USERNAME]]/repos?per_page=100 [[...]]

curl -i -u [[USERNAME]] -s https://api.github.com/users/[[USERNAME]]/repos?per_page=100&access_token=[[TOKEN]] [[...]]
Run Code Online (Sandbox Code Playgroud)

接下来的部分[[...]]是各种代码片段,如上面链接中的代码片段。我相信这些部分很好,因为它们克隆公共存储库没有任何问题,而问题在于我无法看到我的私人存储库,尽管有访问令牌。需要注意的是,当您生成访问令牌时,您定义了它可以执行的操作范围,并且我已经定义了我的访问令牌,可以完全访问所有内容,包括repo,这应该授予它对私有存储库的控制权。

此外,有时当我尝试上面的命令时,我会得到以下响应:

 HTTP/1.1 401 Unauthorized
Server: GitHub.com
Date: Fri, 13 Oct 2017 08:08:01 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 93
Status: 401 Unauthorized
X-GitHub-Media-Type: github.v3; format=json
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 41
X-RateLimit-Reset: 1507884238
Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'none'
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
X-Runtime-rack: 0.060685
X-GitHub-Request-Id: D038:4E67:1349CC:2CB494:59E07461

{
  "message": "Bad credentials",
  "documentation_url": "https://developer.github.com/v3"
}
Run Code Online (Sandbox Code Playgroud)

尽管知道我的资历很好。

有谁知道我出了什么问题吗?我已经围绕这个问题转了好几个小时,却一无所获。

小智 5

好吧,经过几天的随机 SO 帖子/要点和 API 文档的浏览,我找到了答案。突破尤其来自这篇文章,因为问题在于我如何构建 GET 请求。虽然它本身没有任何问题,但有两种方法可以解决它,一种有效,一种无效,并且 GitHub 没有记录这一点,请查看 \xc2\xaf\\_(\xe3\ x83\x84)_/\xc2\xaf

\n\n

这是一个格式正确的curl命令,用于获取用户的所有(公共和私人)存储库:

\n\n
curl -iH "Authorization: token [[TOKEN]]" https://api.github.com/user/repos\n
Run Code Online (Sandbox Code Playgroud)\n\n

[[TOKEN]] 部分应该是您的 OAuth 令牌。要生成此内容,请阅读此处,或执行以下摘要:

\n\n
    \n
  • 在 GitHub 上,转至Settings > Developer settings > Personal access tokens
  • \n
  • 点击Generate new token
  • \n
  • 对其进行描述并确保选中旁边的框repo(它将自动检查存储库下的所有子类别,这很好)
  • \n
  • 单击Save并复制下一页上的令牌字符串,这是您唯一一次看到它,并且应将其视为密码或私钥(如果丢失,您可以随时删除令牌并生成新令牌)
  • \n
\n\n

-i标志包括请求标头。这里需要注意的两个重要事项是:

\n\n
    \n
  • 您可以在标题下方看到大约 10 个项目X-OAuth-Scopes: repo。这告诉您所传递的令牌的范围。它可以不仅仅有repo,但至少有repo
  • \n
  • 标头中的下一个条目是X-Accepted-OAuth-Scopes:。这是您正在执行的操作所需的范围。要查询存储库信息,没有列出任何范围,但实际克隆存储库的下一个命令将需要该repo范围
  • \n
\n\n

-H后面的授权字符串需要

\n\n

现在,要克隆所有存储库,请使用这一行命令。要点有很多代码片段可以在 php、ruby、python 等中实现这一点,但我个人喜欢 bash 解决方案:

\n\n
for i in `curl -H "Authorization: token [[TOKEN]]" https://api.github.com/user/repos?per_page=100 | grep ssh_url | cut -d \':\' -f 2-3|tr -d \'",\'`; do git clone $i; done\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于上述内容的一些注意事项:

\n\n
    \n
  • 默认情况下,它会要求您输入每个存储库的密码。这可能会很烦人,因此在运行命令之前(或者您可以使用取消命令Ctrl+C然后执行此操作),请运行以下命令将 SSH 密钥添加到您的ssh-agent:\n\neval "$(ssh-agent -s)" \nssh-add -t 1h ~/.ssh/path/to/ssh/key\n
  • \n
  • 如果您尝试执行此操作,但针对的是组织而不是用户,请查看我上面发布的要点链接以获取更多示例
  • \n
  • 如果您尝试对超过 100 个存储库执行此操作,请使用page如下参数:?page=1&per_page=100请注意,API 最多仅支持 100 个,因此任何超过 100 个的数字都是毫无意义的,并且会默默失败)
  • \n
\n\n

编辑:我在使用 Ruby 版本的逻辑代码时想出了一些额外的东西,如果您(作为用户)是多个组织的一部分并且不想从其中一些组织下载存储库,那么您可以通过指定与组织名称匹配的字符串来创建黑名单。例如,我想对我有权访问的所有存储库进行编码,但我不想克隆“Google”或“Twitter”中的存​​储库:

\n\n
curl -H "Authorization: token [[TOKEN]]" https://api.github.com/user/repos?per_page=100 | ruby -rubygems -e \'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]}] unless repo["full_name"].include? "Google" or repo["full_name"].include? "Twitter"}\'\n
Run Code Online (Sandbox Code Playgroud)\n