我试图将我的所有回购邮件一次克隆到我的计算机上,所有这些都是私有的。我尝试了无数的单行和脚本(即here和here),但都没有。
最初我会收到有关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]] [[...]]
以下[[...]]
部分是各种代码段,如上面链接中的代码段。我相信这些部分很好,因为他们克隆公共回购没有任何问题,而问题在于我尽管有一个访问令牌,却无法看到我的私人回购。重要的是要注意,当您生成访问令牌时,您可以定义范围以及它可以执行的操作,并且我已经定义了对所有内容的完全访问权限,包括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"
}
尽管知道我的凭据还不错。
有谁知道我的错误是什么?我已经绕着这个圈跑了好几个小时,然后空了。
答案 0 :(得分:1)
好吧,经过几天的随机SO帖子/ Gists和API文档的拖钓,我发现了它。特别是this帖子取得了突破,因为问题是我如何构建我的GET请求。虽然它本身没有任何问题,但有两种方法可以解决它,一种是有效的,一种是没有的,而且GitHub没有记录这一点,去图¯\ _(ツ)_ /¯
这是一个格式正确的curl
命令,用于获取用户的所有(公共和私有)存储库:
curl -iH "Authorization: token [[TOKEN]]" https://api.github.com/user/repos
[[TOKEN]]部分应该是您的OAuth令牌。要生成此内容,请阅读here,或执行以下摘要:
Settings > Developer settings > Personal access tokens
Generate new token
repo
旁边的框(它会自动检查repo下的所有子类别,这很好)Save
并在下一页复制令牌字符串,这是您唯一可以看到它并应被视为密码或私钥(您可以随时删除令牌并生成新的令牌)一个,如果你失去了这个) -i
标志包含请求标头。要在这里寻找的两件重要事情是:
X-OAuth-Scopes: repo
中约有10个左右的项目。这告诉您传递的令牌的范围。它不仅可以repo
,还必须至少repo
X-Accepted-OAuth-Scopes:
。这是您正在执行的操作所需的范围。要查询回购信息,没有列出任何范围,但实际克隆回购的下一个命令将需要repo
范围后面的授权字符串需要
-H
标志
现在,要克隆所有存储库,请使用此单行命令。 This这里有许多代码片段可以在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密钥添加到ssh-agent
:
eval "$(ssh-agent -s)"
ssh-add -t 1h ~/.ssh/path/to/ssh/key
page
参数,如下所示:?page=1&per_page=100
(请注意,API仅支持最多100个,因此任何高于100的数字都是无意义的并将默默地失败)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"}'
答案 1 :(得分:0)
尝试这样的事情(它使用jq只获取ssh_url,以便您可以克隆存储库):
GITHUB="https://api.github.com/user/repos?per_page=100&type=owner"
for repo in $(curl -s -u user:token ${GITHUB} | jq -r '.[] | .ssh_url')
do
git clone --mirror ${repo}
done
使用curl时,您需要传递令牌,就好像它是密码一样(Basic Authentication):
curl -u user:token
检查" Other Authentication Method"在GitHub页面上
答案 2 :(得分:0)
我为此编写了一个命令行工具github-dl
。
要使用它(假设您已经安装了nodejs)
npx github-dl -d test wires
这会将所有存储库从wires
克隆到test
目录中。
详细
它实际上并没有克隆存储库,而是编写了一个.txt
文件,您可以将其传递到xargs
中进行克隆。