如何使用 http 客户端手动执行 `git ls-remote`

How to manually do `git ls-remote` with a http client

我想每小时查询 10000 多个 https git 存储库的最新远程 HEAD 提交。基本上这个 x10000:

remote=https://github.com/torvalds/linux
git ls-remote $remote HEAD | awk '{print }'

大多数(但不是全部)远程都在一台服务器上 (github.com)。我不想使用 github API,因为一些 repos 不在 github 上,而且 API 有限制。

因此我想使用 git https 远程协议,但我更愿意使用 (lib)curl 而不是 git 来实现它,以便更好地控制 https 设置,并且希望通过同一连接并行执行请求。

在哪里可以找到更多关于 git ls-remote 正在发出的 http 请求(使用“智能”git 协议)的更多信息,以便我可以使用 libcurl 执行相同的调用?

我看过 HTTP transfer protocols spec and docs on the Git-Internals-Transfer-Protocols,但这很笼统,没有深入 ls-remote 的细节。

我认为 http 协议文档的 Discover references 部分是您想要的。

如果您与 GitHub 交互,则需要使用“智能”协议,因为:

$ curl https://github.com/docker/docker.git/info/refs                         Please upgrade your git client.
GitHub.com no longer supports git over dumb-http: https://github.com/blog/809-git-dumb-http-transport-to-be-turned-off-in-90-days

因此,根据文档,我们需要 运行:

$ curl https://github.com/docker/docker.git/info/refs'?service=git-upload-pack'

这会产生二进制输出,curl 默认情况下不会显示在您的终端上。如果我们将它转​​储到一个文件 (-o refs.txt),然后检查该文件,我们会发现我们几乎得到了 git ls-remote.

的输出

比较:

$ git ls-remote https://github.com/docker/docker.git
[lars@madhatter python]$ git ls-remote https://github.com/docker/docker.git | head -5
235f86270d4976e7d17c11eccdb65f81d76f5c40        HEAD
175f1829377413b1887a0c38232b1cda975fd71c        refs/heads/1.12.x
473c5701cb66403b0535a5c01845cb0f27fbeb47        refs/heads/1.13.x
ceb9e244d934d87104b7e4e0032f1d389e47fd64        refs/heads/17.03.x
a1e8b2ede880ffa159c72b4d62c827475fbff531        refs/heads/17.04.x

并且:

$ curl  -s https://github.com/docker/docker.git/info/refs'?service=git-upload-pack' | head-7
001e# service=git-upload-pack
00000156235f86270d4976e7d17c11eccdb65f81d76f5c40 HEADmulti_ack thin-pack side-band side-band-64k ofs-delta shallow deepen-since deepen-not deepen-relative no-progress include-tag multi_ack_detailed allow-tip-sha1-in-want allow-reachable-sha1-in-want no-done symref=HEAD:refs/heads/master filter object-format=sha1 agent=git/github-gf942d1d040ff
003f175f1829377413b1887a0c38232b1cda975fd71c refs/heads/1.12.x
003f473c5701cb66403b0535a5c01845cb0f27fbeb47 refs/heads/1.13.x
0040ceb9e244d934d87104b7e4e0032f1d389e47fd64 refs/heads/17.03.x
0040a1e8b2ede880ffa159c72b4d62c827475fbff531 refs/heads/17.04.x
004089658bed64c2a8fe05a978e5b87dbec409d57a0f refs/heads/17.05.x

根据文档,您需要解码一些协议数据,但除此之外,这会为您提供与 git ls-remote.

相同的参考列表

大多数服务器应该支持“智能”协议。