目标
将存储库克隆到名为.owner.login
(Github REST API 中的参数)的子目录中,其中包含jq
、git clone
和xargs
。
前言
我在某处获取了一段代码,允许我使用 、 和 克隆jq
存储git clone
库xargs
。但是,我无法对其进行设置,以便它为每个存储库创建一个新的父目录。 (我是一个 Windows 用户,但对于我想要实现的目标,除了这个 bash 脚本之外,我无法查询任何其他解决方案。我不知道 GNU 命令如何交互在一起,这是我能放在一起的最多的知识)
原始代码
UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
jq -r '.[].html_url' |\
xargs -l git clone
这是我的修改:
UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
jq -r '.[] | .html_url, .full_name' |\
xargs -l git clone
我得到了与原始代码相同的结果。还有这个错误日志:
fatal: repository 'repoauthor/reponame?' does not exist
我不知道从哪里来的\?
。
所以我尝试调试它
通过将代码拆分为
UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
jq -r '.[] | .html_url, .full_name'
返回这个:
https://github.com/repo1name/repo1author
repo1name/repo1author
https://github.com/repo2name/repo2author
repo2name/repo2author
... etc
它以 2 条不同的行而不是一行返回.html_url
, 。.full_name
我认为这是问题所在,但后来我尝试xargs
单独运行:
https://github.com/repoauthor/reponame |\
xargs -l git clone
它只是让我进入 git 帮助文件。
太长了;博士
我需要将生成的字符串集成jq
到xargs
.但是,jq
将重要的字符串生成为两个不同的行,这可能是导致错误的原因,但我不知道如何解决它。
答案1
由于您没有向我们提供特定的 Github 用户来重现您的特定问题,因此我已经使用我自己认识的其他 Github 帐户进行了测试。
您的尝试有两个主要问题。
xargs
理想情况下应该引用所阅读的各个论点。xargs
需要git clone
使用两个单独的参数进行调用:存储库 URL 和要将其克隆到的目标目录。
您可以像这样整理参数的引用:
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |
jq -r '.[] | [ .html_url, .full_name ] | @sh'
这将从对请求的响应中提取所需信息curl
到一个数组中,然后使用@sh
运算符将每个这样的数组输出为一行 shell 引用的单词。
严格来说,我们也可以使用.[] | .html_url, .full_name | @sh
as表达式来获取带有单 shell 引用字符串的行流,这与我们使用它的方式jq
无关。xargs
给定这个单词流,我们然后调用git clone
via xargs
:
xargs -n 2 git clone
该-n 2
方法xargs
将一次使用其输入流中的两个参数来调用该实用程序。
把它放在一起:
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |
jq -r '.[] | [ .html_url, .full_name ] | @sh' |
xargs -n 2 git clone