我试图一次把我所有的repos克隆到我的电脑上,所有的repos都是私有的,我试过无数的一行程序和脚本(即here和here),但是没有一个能用。
最初我会收到JSON无法解析响应的错误,最终我意识到这是因为响应是空的,因为我没有公共repo。当我做一个测试公共repo时,它会返回一个JSON对象,其中包含该特定repo的信息,但没有私有repo的信息。据我所知,我需要将我的用户名和访问令牌传递给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]] [[...]]
下面的[[...]]
部分是各种代码片段,就像上面链接中的代码片段一样。我相信这些部分是好的,因为它们克隆公共repos没有任何问题,而问题在于尽管有访问令牌,但我无法看到我的私有repos。需要注意的是,当您生成访问令牌时,您定义了它可以做什么的范围。我已经将我的定义为对所有内容都具有完全访问权限,包括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"
}
尽管我知道我的资历还不错。
有人知道我出了什么问题吗?我已经绕着这个问题转了几个小时,结果一无所获。
5条答案
按热度按时间juzqafwq1#
好了,在浏览了几天随机的SO帖子/Gist和API文档之后,我终于明白了。这个突破性的发现尤其来自this帖子,因为问题在于我如何构造我的GET请求。虽然它本身没有什么问题,但有两种方法可以解决这个问题,一种有效,一种无效,GitHub并没有记录这一点,请参见figure ¶_(¶)_/
下面是一个格式正确的
curl
命令,用于获取用户的所有(公共和私有)回购协议:TOKEN部分应该是您的OAuth令牌。要生成此令牌,请读取here,或执行以下摘要:
Settings > Developer settings > Personal access tokens
Generate new token
repo
(它会自动检查所有子类别下的回购,这是罚款)Save
并在下一页复制令牌字符串,这是您唯一一次看到它,应该将其视为密码或私钥(如果丢失令牌,您可以随时删除令牌并生成一个新的)-i
标志包括请求头。这里需要注意的两个重要事项是:X-OAuth-Scopes: repo
,它告诉您传递的令牌具有哪些作用域,它可以具有多个repo
,但至少具有repo
X-Accepted-OAuth-Scopes:
。这是您正在执行的操作所需的作用域。要查询存储库信息,没有列出任何作用域,但实际克隆存储库的下一个命令将需要repo
作用域后面的授权字符串需要
-H
标志现在,要克隆所有repos,请使用以下一行命令。This gist在php、ruby、python等中有许多代码片段可以实现这一点,但我个人更喜欢bash解决方案:
关于上述内容的一些注意事项:
Ctrl+C
取消命令,然后执行此操作),运行以下命令将SSH密钥添加到ssh-agent
:eval "$(ssh-agent -s)" ssh-add -t 1h ~/.ssh/path/to/ssh/key
page
参数,如下所示:?page=1&per_page=100
(请注意,API最多只支持100,因此任何大于100的数字都没有意义,并且将静默失败)编辑:一些额外的东西,我想出了在我自己的混乱使用Ruby版本的逻辑代码,如果你(作为用户)是多个组织的一部分,并且不想从其中一些组织下载回购协议,您可以通过指定与组织名称匹配的字符串来创建黑名单。例如,我想对我有权访问的所有回购协议进行编码,但我不想在"谷歌"或"推特"上复制这些回复:
baubqpgj2#
Github CLI * 几乎 * 本机支持此功能
1.下载Github CLI
1.登录
1.列出repos并通过管道输入clone命令
"巴什"
qrjkbowd3#
尝试类似这样的操作(它使用jq只获取ssh_url,以便克隆repos):
当使用curl时,您需要像传递密码一样传递令牌(基本身份验证):
检查GitHub页面上的“Other Authentication Method“
zlwx9yxi4#
我编写了一个命令行工具来完成此任务,称为
github-dl
。要使用它(假设您安装了nodejs)
这将把所有repo从
wires
克隆到test
目录中。具体地说,它
1.请求身份验证(支持2FA)
1.通过Github API获取用户/组织的repos列表
1.为此执行分页,因此支持100个以上的repo
它实际上并不克隆repos,而是编写一个
.txt
文件,您可以将该文件传递到xargs
以执行克隆。ttcibm8c5#
如果你想从一个组织克隆所有的存储库,你可以使用下面的代码。