有没有办法以编程方式获取私有github存储库的zipball?

42

我们需要获取一个私有 repo 的 zipball。对于公共的 repo,可以通过 GitHub API 或手动方式简单地获取 (https://github.com/user/repo/zipball/master)。但对于私有 repo,即使拥有 oAuth token 也不太明显该如何操作。


2
这个“Zipball”是什么?你能给我更多的描述吗? - Naresh
7个回答

63

新的替代方案

由于给出的接受答案不再有效,我想解释一下我是如何利用github API的新变化来实现的。

新的下载API链接

首先,我在这里找到了关于下载存档的信息: https://developer.github.com/v3/repos/contents/#get-archive-link

公共仓库

如果是公共仓库,那就非常简单...你可以这样做:

curl -L https://api.github.com/repos/pengwynn/octokit/tarball > octokit.tar.gz

私有仓库

如果这是一个私有仓库,您需要通过转到设置然后选择“开发者设置”/个人访问令牌来创建一个oAuth令牌。 我已经创建了一个个人令牌。

然后根据以下页面上的说明,我找到了如何获取您有权限访问的私有仓库: https://developer.github.com/v3/#authentication

完整代码

curl -H "Authorization: token ab499f3b..." \
-L https://api.github.com/repos/godzilla/my_priv_repo/tarball > wut.tar.gz

请确保将ab499f3b...替换为您的实际令牌。

在 URL 前面加上 -L 是我所缺少的...谢谢! - Graham Hency

2

编辑:这个方法已经失效。


使用CURL:

curl -L -F "login=$USER" -F "token=$TOKEN" https://github.com/$USER/$REPO/$PKGTYPE/$BRANCHorTAG

$TOKEN是您Github个人资料中的API令牌,而不是用于与APIv3通信的oAuth2令牌。

$USER是令牌连接的用户账户,不一定是组织/其他用户所拥有的存储库。第二个$USER实例是存储库所属的用户/帐户。

$REPO是私有存储库的名称。

$PKGTYPE是tarball或zipball,$BRANCHorTAG是分支,如master,或提交的标签名称。

第一个$USER实例必须可以访问属于第二个$USER实例的存储库。

我找不到这方面的文档,因此如果您需要更详细的信息,我也可以提供一些介绍。


不确定这是否还有效:https://dev59.com/u2PVa4cB1Zd3GeqP5GF6 - Josh Stuart
这肯定不再起作用了。会生成“必须启用Cookie才能使用GitHub”的消息。我认为你应该使用api.github.com,但是URL找不到。 - Bostone
仍然有效,请查看我的答案:https://dev59.com/4Wkx5IYBdhLWcg3wAvmn#68800637 - C-Y

2
我遇到了同样的问题,这个方法对我有效(截至2015年2月)。
curl -O -J -L -u $YOUROAUTHKEY:x-oauth-basic https://github.com/$USER/$REPO/archive/master.zip

oAuth作为头部解决方案对我来说不起作用,但是将密钥放入用户名并指定类型的方法有效。然后它会给出一个302重定向到正确的链接。
详细命令真的帮助我排除了使用的凭据是否被接受的问题(404与401之间的区别)。

2

必须通过授权头指定访问令牌! - undefined

1

除了 api.github.com,您还可以直接从 github.com 下载 tarball/zipball:

(对于公共 repo,可以省略令牌头 -H "Authorization: token $(yourToken)")

curl -H "Authorization: token $(yourToken)" -o code.tar.gz -L https://github.com/$(username)/$(reponame)/tarball/$(branchName/TagName/hashValue)

curl -H "Authorization: token $(yourToken)" -o code.tar.gz -L https://github.com/$(username)/$(reponame)/archive/$(branchName/TagName/hashValue).tar.gz

或者对于 zipball

curl -H "Authorization: token $(yourToken)" -o code.zip -L https://github.com/$(username)/$(reponame)/zipball/$(branchName/TagName/hashValue)

curl -H "Authorization: token $(yourToken)" -o code.zip -L https://github.com/$(username)/$(reponame)/archive/$(branchName/TagName/hashValue).zip

你可以根据这个答案生成一个令牌https://dev59.com/4Wkx5IYBdhLWcg3wAvmn#23796159


1

我似乎没有问题从私有仓库下载zipball。我使用您指定的相同格式,它完美地工作。

我使用OAuth2获取存储库,但是我使用您给出的格式构建zip ball的链接。 这是我使用的应用程序

如果您想获取OAuth2令牌,请使用GitHub API v3格式,它非常简单。尽管这并不完全符合您的问题:

是我从GitHub获取OAuth2令牌的方法,用于这个Chrome扩展程序

更新

@jayarjo 我在202行构建URL。我只是像你指定的那样构建URL,OAuth2令牌甚至没有用到它。我的令牌只允许我在创建标记之前获取所有用户的私人数据。但是它可以正常工作...

我认为我实际上能够下载zipball的原因是URL实际上是https://github.com/*,因为我当前已经登录了OAuth2,所以我有权限访问该URL - 而听起来你没有,所以你会得到404错误。

您可以尝试向页面发送请求,如果收到错误响应,请提示用户先登录,然后当您请求zipball时,您应该可以轻松获取它。


奇怪...每次尝试时都会出现“未找到”错误。而且当使用我指定的相同格式时,不确定在哪里放置令牌?..您能链接到执行此操作的特定代码行吗? - jayarjo
@jayarjo 更新了我的答案 - 基本上用户必须登录才能访问该URL。那么您就不会收到404错误。 - jjNford
但是我获取了令牌(我的意思是在尝试那个URL时我已经有了它)。但是这就是你所做的所有事情,它就能正常工作吗?也许我在这里忽略了一些简单的东西... - jayarjo
@jayarjo - 我觉得你没有理解我的意思。因为用户必须授权他们的应用程序,所以他们必须登录GitHub。因此,他们可以访问链接。如果用户没有登录,则我的链接也无法工作。再次强调,用户必须登录GitHub才能使您的链接工作(登录www.github.com而不是您的应用程序)。 - jjNford
但是如果用户没有登录,你如何获取用户的令牌?我肯定在这里漏掉了什么... - jayarjo
根据OAuth2的定义,用户必须登录以授权请求应用程序的权限。(http://oauth.net/2/) - jjNford

0

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