我试图立即将所有存储库克隆到我的计算机上,所有这些存储库都是私有的。我尝试过无数的俏皮话和脚本(即,这里和这里的),但它们都不起作用。
最初,我会收到有关 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命令,用于获取用户的所有(公共和私人)存储库:
curl -iH "Authorization: token [[TOKEN]]" https://api.github.com/user/repos\nRun Code Online (Sandbox Code Playgroud)\n\n[[TOKEN]] 部分应该是您的 OAuth 令牌。要生成此内容,请阅读此处,或执行以下摘要:
\n\nSettings > Developer settings > Personal access tokensGenerate new tokenrepo(它将自动检查存储库下的所有子类别,这很好)Save并复制下一页上的令牌字符串,这是您唯一一次看到它,并且应将其视为密码或私钥(如果丢失,您可以随时删除令牌并生成新令牌)该-i标志包括请求标头。这里需要注意的两个重要事项是:
X-OAuth-Scopes: repo。这告诉您所传递的令牌的范围。它可以不仅仅有repo,但至少有repoX-Accepted-OAuth-Scopes:。这是您正在执行的操作所需的范围。要查询存储库信息,没有列出任何范围,但实际克隆存储库的下一个命令将需要该repo范围这-H后面的授权字符串需要
现在,要克隆所有存储库,请使用这一行命令。这要点有很多代码片段可以在 php、ruby、python 等中实现这一点,但我个人喜欢 bash 解决方案:
\n\nfor 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\nRun Code Online (Sandbox Code Playgroud)\n\n关于上述内容的一些注意事项:
\n\nCtrl+C然后执行此操作),请运行以下命令将 SSH 密钥添加到您的ssh-agent:\n\neval "$(ssh-agent -s)" \nssh-add -t 1h ~/.ssh/path/to/ssh/key\npage如下参数:?page=1&per_page=100请注意,API 最多仅支持 100 个,因此任何超过 100 个的数字都是毫无意义的,并且会默默失败)编辑:我在使用 Ruby 版本的逻辑代码时想出了一些额外的东西,如果您(作为用户)是多个组织的一部分并且不想从其中一些组织下载存储库,那么您可以通过指定与组织名称匹配的字符串来创建黑名单。例如,我想对我有权访问的所有存储库进行编码,但我不想克隆“Google”或“Twitter”中的存储库:
\n\ncurl -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"}\'\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
7935 次 |
| 最近记录: |