如何使用 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
.
相同的参考列表
大多数服务器应该支持“智能”协议。
我想每小时查询 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
.
大多数服务器应该支持“智能”协议。