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

l0oc07j2  于 2023-01-27  发布在  Git
关注(0)|答案(5)|浏览(178)

我试图一次把我所有的repos克隆到我的电脑上,所有的repos都是私有的,我试过无数的一行程序和脚本(即herehere),但是没有一个能用。
最初我会收到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"
}

尽管我知道我的资历还不错。
有人知道我出了什么问题吗?我已经绕着这个问题转了几个小时,结果一无所获。

juzqafwq

juzqafwq1#

好了,在浏览了几天随机的SO帖子/Gist和API文档之后,我终于明白了。这个突破性的发现尤其来自this帖子,因为问题在于我如何构造我的GET请求。虽然它本身没有什么问题,但有两种方法可以解决这个问题,一种有效,一种无效,GitHub并没有记录这一点,请参见figure ¶_(¶)_/
下面是一个格式正确的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(它会自动检查所有子类别下的回购,这是罚款)
  • 点击Save并在下一页复制令牌字符串,这是您唯一一次看到它,应该将其视为密码或私钥(如果丢失令牌,您可以随时删除令牌并生成一个新的)

-i标志包括请求头。这里需要注意的两个重要事项是:

  • 在头中大约10个条目中,您可以看到X-OAuth-Scopes: repo,它告诉您传递的令牌具有哪些作用域,它可以具有多个repo,但至少具有repo
  • 标题中的下一个条目是X-Accepted-OAuth-Scopes:。这是您正在执行的操作所需的作用域。要查询存储库信息,没有列出任何作用域,但实际克隆存储库的下一个命令将需要repo作用域

后面的授权字符串需要-H标志
现在,要克隆所有repos,请使用以下一行命令。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密钥添加到ssh-agenteval "$(ssh-agent -s)" ssh-add -t 1h ~/.ssh/path/to/ssh/key
  • 如果您正在尝试这样做,但是针对的是组织而不是用户,请查看我上面发布的要点链接以获取更多示例
  • 如果您尝试对超过100个回购进行此操作,请使用page参数,如下所示:?page=1&per_page=100(请注意,API最多只支持100,因此任何大于100的数字都没有意义,并且将静默失败)

编辑:一些额外的东西,我想出了在我自己的混乱使用Ruby版本的逻辑代码,如果你(作为用户)是多个组织的一部分,并且不想从其中一些组织下载回购协议,您可以通过指定与组织名称匹配的字符串来创建黑名单。例如,我想对我有权访问的所有回购协议进行编码,但我不想在"谷歌"或"推特"上复制这些回复:

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

baubqpgj2#

Github CLI * 几乎 * 本机支持此功能

1.下载Github CLI
1.登录

gh auth login

1.列出repos并通过管道输入clone命令
"巴什"

gh repo list <userName> --limit 999 --json name --jq ".[]|.name" \ 
  | xargs -L1 gh repo clone
    • 动力 shell **
gh repo list <userName> --limit 999 --json name --jq ".[]|.name" |
   ForEach-Object { gh repo clone $_ }
qrjkbowd

qrjkbowd3#

尝试类似这样的操作(它使用jq只获取ssh_url,以便克隆repos):

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时,您需要像传递密码一样传递令牌(基本身份验证):

curl -u user:token

检查GitHub页面上的“Other Authentication Method

zlwx9yxi

zlwx9yxi4#

我编写了一个命令行工具来完成此任务,称为github-dl
要使用它(假设您安装了nodejs)

npx github-dl -d test wires

这将把所有repo从wires克隆到test目录中。
具体地说,它
1.请求身份验证(支持2FA)
1.通过Github API获取用户/组织的repos列表
1.为此执行分页,因此支持100个以上的repo
它实际上并不克隆repos,而是编写一个.txt文件,您可以将该文件传递到xargs以执行克隆。

ttcibm8c

ttcibm8c5#

如果你想从一个组织克隆所有的存储库,你可以使用下面的代码。

gh repo list ORGNAME  --limit 999 --json name --jq ".[]|.name" | xargs printf -- 'ORGNAME/%s\n' | xargs -L1 gh repo clone

相关问题