如何从GitHub克隆所有repos(包括私有回购)?

时间:2017-10-13 08:30:28

标签: json git curl github

我试图将我的所有回购邮件一次克隆到我的计算机上,所有这些都是私有的。我尝试了无数的单行和脚本(即herehere),但都没有。

最初我会收到有关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"
}

尽管知道我的凭据还不错。

有谁知道我的错误是什么?我已经绕着这个圈跑了好几个小时,然后空了。

3 个答案:

答案 0 :(得分:1)

好吧,经过几天的随机SO帖子/ Gists和API文档的拖钓,我发现了它。特别是this帖子取得了突破,因为问题是我如何构建我的GET请求。虽然它本身没有任何问题,但有两种方法可以解决它,一种是有效的,一种是没有的,而且GitHub没有记录这一点,去图¯\ _(ツ)_ /¯

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

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

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

  • 在GitHub上,转到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
  • 如果您尝试这样做,但对于组织而不是用户,请查看我上面发布的要点链接以获取更多示例
  • 如果您尝试使用超过100个repos执行此操作,请使用page参数,如下所示:?page=1&per_page=100(请注意,API仅支持最多100个,因此任何高于100的数字都是无意义的并将默默地失败)
编辑:我在使用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"}'

答案 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目录中。

详细

  1. 请求身份验证(支持2FA)
  2. 通过Github API获取用户/组织的仓库清单
  3. 为此进行分页,因此支持超过100个回购

它实际上并没有克隆存储库,而是编写了一个.txt文件,您可以将其传递到xargs中进行克隆。