json - 如何从 GitHub 克隆所有 repos(包括私有(private) repos)?

标签 json git curl github

我正在尝试将我所有的存储库一次克隆到我的计算机上,所有这些都是私有(private)的。我已经尝试了无数的单行代码和脚本(即 herehere ),但它们都不起作用。

最初我会收到有关 JSON 无法解析响应的错误,我最终意识到这是因为响应为空,因为我没有公共(public)存储库。当我进行测试公共(public) repo 时,它会返回一个 JSON 对象,其中包含该特定 repo 的信息,但没有私有(private) repo 的信息。据我所知,我需要将我的用户名和访问 token 传递给 GitHub,其中访问 token 是在 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]] [[...]]

后面的 [[...]] 部分是各种代码片段,如上面链接中的代码片段。我相信这些部分很好,因为它们毫无问题地克隆了公共(public) repo 协议(protocol),而问题在于我尽管拥有访问 token ,但无法看到我的私有(private) repo 协议(protocol)。重要的是要注意,当您生成访问 token 时,您定义了它可以做什么的范围,我已经定义了我的所有内容的完全访问权限,包括 repo,这应该授予它控制权通过私有(private) 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"
}

尽管知道我的凭据很好。

有人知道我出了什么问题吗?几个小时以来,我一直在绕着这个转圈,结果一无所获。

最佳答案

好吧,经过几天的随机 SO 帖子/Gists 和 API 文档的搜索后,我明白了。突破来自this特别是发布,因为问题是我如何构建我的 GET 请求。虽然它本身没有任何问题,但有两种方法可以解决,一种有效,一种无效,GitHub 没有对此进行记录,请看图¯\_(ツ)_/¯

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

curl -iH "Authorization: token [[TOKEN]]" https://api.github.com/user/repos

[[TOKEN]] 部分应该是您的 OAuth token 。要生成它,请阅读 here ,或做以下总结:

  • 在 GitHub 上,转到设置 > 开发人员设置 > 个人访问 token
  • 点击生成新 token
  • 给它一个描述,并确保选中 repo 旁边的框(它将自动检查 repo 下的所有子类别,这很好)
  • 单击保存 并在下一页复制 token 字符串,这是您唯一一次看到它并且应该被视为密码或私钥(您始终可以删除 token 并如果你丢失了这个,生成一个新的)

-i 标志包括请求 header 。此处要查找的两个重要事项是:

  • 在 header 的下方大约 10 项左右,您会看到 X-OAuth-Scopes: repo。这是在告诉您传递的 token 的范围。它可以不止有 repo,但至少有 repo
  • header 中的下一个条目是 X-Accepted-OAuth-Scopes:。这是您正在执行的操作所需的范围。要查询 repo 信息,没有列出任何范围,但实际克隆 repo 的下一个命令将需要 repo 范围

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

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

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

关于上面的一些说明:

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

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

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"}'

关于json - 如何从 GitHub 克隆所有 repos(包括私有(private) repos)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46725688/

相关文章:

php - PHP 和 node.js 可以在同一台服务器上运行吗

java - MessagePack Java 序列化为数组

git - Cherry Pick 提交订单

git - 我怎样才能让 git-svn 摆脱不再存在的远程分支?

bash - 如何在 shell 脚本中的 curl 命令中传递变量

php - 你如何使用 php 的 CURL 通过使用 ssh (socks...) 的服务器进行代理?

c++ - boost.property_tree 读取 json 预期的输入结束

javascript - 预输入未显示建议​​列表

Git 添加文件夹并推送

PHP Curl 未加载