【问题标题】:Is the Git "smart" remote protocol documented anywhere?Git“智能”远程协议是否记录在任何地方?
【发布时间】:2021-08-26 23:41:24
【问题描述】:

我发现许多页面声称是版本 1 和 2 协议的文档(linklink 等),但它们都没有包含足够的详细信息来实际实现客户端(例如,他们没有提到 https 请求应该是 GET 还是 POST ,也没有包含或多或少任何重要用法的示例。

有人知道更好的文档吗?针对开发者的东西?


背景:

给定一个远程 URL,我需要

  1. 找到HEAD
  2. 找到适用于HEAD 的最新“shallow-since”时间戳。

而且我需要从一个无法访问它可以写入的文件系统的进程中执行此操作(因此即使是 --depth=1 克隆也不可能)。

【问题讨论】:

  • 智能协议独立于所使用的传输方式:通过 ssh 与通过 http 或 https 相同。它只需要能够执行双向字节流的东西。 http/https 包装器在这里并不有趣(尽管如果您正在编写使用包装器的东西,它当然有趣的!)。
  • 嗯,我使用 http 作为传输,所以我觉得这里很有趣。

标签: git git-remote


【解决方案1】:

Documentation/technical 目录中有几个文档,它们应该一起列举必要的部分:

  • http-protocol.txt
  • pack-protocol.txt
  • protocol-capabilities.txt
  • protocol-common.txt
  • protocol-v2.txt

请注意,实际上有两种不同的智能协议,v0 和 v2。后者在大多数主要托管网站上应该很常见,但并非无处不在。

您可以使用GIT_CURL_VERBOSE=1 和普通客户端查看数据。

至于您要查找的数据,您可以通过发出普通的 ref 请求(例如,git ls-remote)找到 HEAD,它会告诉您 symref 的值。第二部分很重要,因为时间戳仅在提交中序列化,并且为了获取任何提交数据,您至少需要执行某种获取或克隆来获取提交对象。您可以在内存中执行此操作,但您可能需要尝试使用 libgit2 之类的库。

【讨论】:

  • “某种获取或克隆”是我一直试图弄清楚的。但我希望找到一种方法来消耗最少的网络带宽,最好是一个恒定的数量或至少少于clone --depth=1 使用的数量。 libgit2 可能会在那里提供一些帮助,但鉴于 CLI 似乎没有提供我想要的东西,我怀疑我需要调用实现细节,根据我的经验,这往往不如有线协议稳定。
  • 您可能想要一个没有任何树对象的部分克隆,但 libgit2 不支持。鉴于现有实现,您将需要放弃不使用本地磁盘或不使用大量带宽。如果您总是使用给定的服务器实现(例如 GitHub),您可以使用 API 来获取最新的提交时间戳,但如果您需要与实现无关的解决方案,那么这些就是限制。
  • 我想知道:如果我可以避免无 FS 约束,git init; git remote add $URL ; git something ... 不做 fetchcheckout 会让我更接近我想要的吗?是否可以欺骗 Git 拉下单个提交(可能只是增量)而没有实际检查它所需的其余数据? -- 我想知道我是否可以在./.git/ 下制造垃圾以使其认为我已经拥有了其他所有东西?
  • 您可以使用裸存储库,但至少需要获取或克隆。您可以进行浅层裸克隆 (git clone --bare --depth 1),然后根据需要查找有关提交的信息。
  • 我不认为--bare 提供了我正在寻找的任何价值。此外,我认为要获得我想要的东西,必须以非预期的方式使用 git,包括对 cli 支持之外的 repo 的修改。
【解决方案2】:

我相信唯一完全准确的回答是“使用来源,卢克!”,尽管我不得不反对你的

例如,他们没有提到 https 请求应该是 GET 还是 POST

给定

HTTP Transport
~~~~~~~~~~~~~~

When using the http:// or https:// transport a client makes a "smart"
info/refs request as described in `http-protocol.txt` and requests that
v2 be used by supplying "version=2" in the `Git-Protocol` header.

   C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
   C: Git-Protocol: version=2

A v2 server would reply:

等等,在您说的其中一个链接的顶部不包含此信息,还是我弄错了?我(重新)学习了足够的 http 以根据需要通过,但这显然是对我的 GET 请求,

【讨论】:

  • 我希望的是可以发送的每个内容的列表以及显示有效 URL、动词和正文的示例(例如 curl 命令)。混合这两个文档,我认为 /info/refs 我们是 only 使用 GET 的端点,其余的使用 POST ......但这只是一个有根据的猜测。
  • 很多服务器不再使用笨拙的 http 协议,至少 github 告诉你它不会。
  • 这就是我询问智能协议的原因。理论上可以通过curl谈智能协议不是吗?
  • 没有。 http 被用于运行代码(编辑:要迂腐,必须设置网络服务器以这种方式解释 url,这就是为什么它是“智能”协议,而不是将 url 解释为文件系统路径的愚蠢协议),特别是在 url 中命名的服务,例如 git-upload-pack。这是一个真正的程序,由 git 提供。
  • 我以为是这样。当我将 curl 指向 github 时,该程序将运行(在 github 的服务器上)并返回我可以阅读和处理的内容。 -- 明确一点,我想成为这里的客户端,而不是服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多