如何使用cURL从GitHub下载tarball?

107

我正在尝试使用cURL从GitHub下载一个tarball,但它似乎没有重定向:

$ curl --insecure https://github.com/pinard/Pymacs/tarball/v0.24-beta2
<html><body>You are being <a href="https://nodeload.github.com/pinard/Pymacs/tarball/v0.24-beta2">redirected</a>.</body></html>
注意:对我而言,wget是有效的:

注意:wget 对我而言是有效的:

$ wget --no-check-certificate https://github.com/pinard/Pymacs/tarball/v0.24-beta2

然而我想使用 cURL ,因为最终我想要像这样内联地解压它:

$ curl --insecure https://github.com/pinard/Pymacs/tarball/v0.24-beta2 | tar zx
我发现重定向后的URL是 https://download.github.com/pinard-Pymacs-v0.24-beta1-0-gcebc80b.tar.gz,但我希望cURL聪明到可以自己找出来。
5个回答

170

使用-L选项来跟随重定向:

curl -L https://github.com/pinard/Pymacs/tarball/v0.24-beta2 | tar zx

4
对于 https,您也很可能需要使用 -k - nicerobot
1
为什么最近在raw.github.com上会出现证书问题?我在新机器上安装homebrew和rvm时遇到了问题。我过去常常从主页复制粘贴,一切正常。现在我遇到了证书问题:ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"curl: (60) SSL证书问题:无法获取本地颁发者证书 更多细节请参见:http://curl.haxx.se/docs/sslcerts.htmlcurl默认使用“bundle”执行SSL证书验证。如果您想关闭curl对证书的验证,请使用-k(或--insecure)选项。 - Chris Cinelli
嗯...有没有可能将子模块也包含在tarball中?似乎对于子模块,tarball中只创建了空目录。 - aurora
不确定这是一个暂时性问题,但目前Github返回500个内部服务器错误。 - B T
17
为了方便大家,如果您想要查询“-L”的含义,它的意思是跟随重定向。 - Steve Kehlet
显示剩余2条评论

50
现代化的做法是:
curl -sL https://github.com/user-or-org/repo/archive/sha1-or-ref.tar.gz | tar xz

根据需要替换user-or-orgreposha1-or-ref

如果您想要一个zip文件而不是tarball,请将后缀.tar.gz替换为.zip

您还可以通过在curl命令中指定-u token:x-oauth-basic选项来获取私有存储库的存档。将token替换为个人访问令牌


3
这正是我寻找的答案!如果您有OAuth令牌,您可以直接使用它; https://token@github.com/user-or-org/repo/archive/sha1-or-ref.tar.gz - svenevs
这对于从发布版而不是存档中下载会如何工作? - waspinator
2
@waspinator ,我使用 curl -OL https://github.com/user-or-org/repo/releases/download/version/<asset name>.tar.gz。请参考此处的示例。 - Wayne
你能解释一下这个方案为什么比被接受的答案更好吗? - Robin Métral
也许是因为 .../tarball/... 方法只生成 tar.gz 格式的文件? GH 后来添加了一种更灵活的方法,根据后缀 .tar.gz.zip 允许您以所需的格式提取存档。我不记得我为什么写这篇文章了。 - Pavel Repin

14

您还可以使用wget来进行在线解压缩。只需将stdout指定为输出文件(-O -):

wget --no-check-certificate https://github.com/pinard/Pymacs/tarball/v0.24-beta2 -O - | tar xz

3

其他的解决方案都需要指定版本号/发布号,这显然会破坏自动化。

这个解决方案- 目前已经测试并且能够与Github API v3一起工作- 但是可以以编程方式使用,获取最新的发行版而无需指定任何标签或发布号码,并将二进制文件解压缩到您在开关--one-top-level="pi-ap"中指定的任意名称。只需在下面的示例中替换用户f1linux和存储库pi-ap为您自己的详细信息即可:

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

这很好,但真的需要一些解释。例如,这是哪个GitHub API版本,它在哪里记录? - l3l_aze
1
@l3l_aze 刚刚编辑了答案,包括当前的Github API版本号。我的解决方案已经测试并且可以正常工作。感谢您的反馈!- T - F1Linux
哇,我没想到这可能比你已经分享的更好。非常感谢! - l3l_aze

2
具体的目录:
cd your_dir && curl -L https://download.calibre-ebook.com/3.19.0/calibre-3.19.0-x86_64.txz | tar zx

1
更好的方式:cd your_dir && curl -L https://download.calibre-ebook.com/3.19.0/calibre-3.19.0-x86_64.txz | tar zx; cd - - zhengquan
完全不需要使用cd命令,tar命令有--directory选项可以为您完成这个操作。所以,您可以使用以下命令:curl --location https://download.calibre-ebook.com/3.19.0/calibre-3.19.0-x86_64.txz | tar --extract --xz --directory your_dir - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接