如何高效地获取GitHub上特定提交的代码仓库?

6
我正在尝试构建一个持续集成系统。每次推送到GitHub都会触发一次构建。
每次构建都需要检出/下载处理的提交所在的存储库。我试图找到一种不需要花费数分钟的方法来做到这一点,因为构建仅需要几秒钟时间。
请注意,我不想在构建之间存储数据(这将消除缓存的可能性)。
我探索过的解决方案:
- `git clone`,然后检出提交:可以工作,但对于大型存储库需要数分钟 - git 2.5 据说引入了获取单个提交的方法,但我无法在GitHub上使用它,我猜测他们没有使用git 2.5 - 使用GitHub API进行git数据,但我无法弄清楚是否可以以某种方式有效地下载特定版本的所有文件(即避免每个文件的单个HTTP请求) - 我在GitHub上看到的每个其他解决方案都要么假定服务器上有最近的git版本,要么认为在我的情况下可以克隆存储库一次,但我的情况不是这样。我每次都从头开始(因为这是一个约束条件)。
因此,在GitHub的特定情况下,我想问:如何(以任何方式)下载特定提交的代码以便能够在该提交上运行持续集成工具?

@JoshLee 谢谢!至少我知道为什么它在GitHub上不起作用了,我不确定我是否做错了什么 :) - Matthieu Napoli
1个回答

8
您可以使用类似以下URL的形式从GitHub下载特定提交的存档文件:
https://github.com/PROJECT/REPO/archive/COMMITID.zip

例如,如果我有一个名为 "dockerize" 的项目,并且想要下载提交 ID 为 169532e ,我可以运行以下命令:
curl -OL https://github.com/larsks/dockerize/archive/169532e.zip

我在这里使用了一个短的提交ID,但是您可以使用长的提交ID、分支、标签等。 这将给我一个包含来自特定提交的文件的.zip存档文件。顶层目录将以PROJECT-LONGCOMMITID命名。例如,上述命令将导致存档中的顶层目录为dockerize-169532eba46757aca8002e1c9bb257079a739f75/README.md。 这只会获取特定提交中的文件;它不会获取.git目录或任何存储库历史记录。

1
谢谢,非常完美!这是相关的API文档链接:https://developer.github.com/v3/repos/contents/#get-archive-link。这是我使用的完整命令:`curl -sS -L -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/$REPOSITORY_NAME/tarball/$COMMIT_ID | tar --strip-components=1 -C /tmp/code -xz`(它适用于私有存储库)。 - Matthieu Napoli
对于公共存储库,可以使用以下命令:curl -sS -L https://api.github.com/repos/$REPOSITORY_NAME/tarball/$COMMI‌​T_ID | tar --strip-components=1 -C /tmp/code -xz - Matthieu Napoli

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