3

一些 Git 服务器或托管服务(显然是 GitHub Enterprise)不支持浅克隆,而是在发送如下请求时停止:

git clone --depth 1 https://server/user/repo.git

有没有办法检测服务器是否支持浅克隆?是否有 Git 或 CURL 命令可以发送到服务器以确定它是否支持浅克隆?

我找到了对Git Protocol Capabilities的参考,这是我需要寻找的吗?我怎样才能掌握服务器的功能?

4

1 回答 1

3

智能协议做一些广告

ssh -x git@server "git-receive-pack 'simplegit-progit.git'"
005bca82a6dff817ec66f4437202690a93763949 refs/heads/master report-status \
    delete-refs side-band-64k quiet ofs-delta \
    agent=git/2:2.1.1+github-607-gfba4028 delete-refs

git-receive-pack 命令立即对它当前拥有的每个引用响应一行——在这种情况下,只有 master 分支及其 SHA-1。
第一行还有一个服务器功能列表(这里是报告状态、删除引用和其他一些功能,包括客户端标识符)。

git remote helpers 有与 shallow capability 相关的选项,但不清楚它们是否会像上面的 ssh 命令一样被宣传。

git 1.6.6更新了包文件传输协议,包括“参考发现”部分:

当客户端最初连接时,服务器将立即响应它拥有的每个引用(所有分支和标签)的列表以及每个引用当前指向的对象名称。

$ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |
nc -v example.com 9418
00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack
side-band side-band-64k ofs-delta shallow no-progress include-tag
00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration
003f7217a7c7e582c46cec22a130adf4b9d7d950fba0 refs/heads/master
003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9
003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0
003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{}
0000

如今(Git 2.23,2019 年第三季度,4 年后),agit fetch -v -v足以显示任何受支持的功能。

请参阅Nguyễn Thái Ngọc Duy ( ) 的提交 0e04297提交 5a88583提交 0778b29(2019 年 6 月 20 日(由Junio C Hamano 合并 -- --提交 b49d337中,2019 年 7 月 9 日)pclouds
gitster

fetch-pack:在顶部打印服务器版本-v -v

在上一个补丁之前,服务器版本打印在所有“ Server supports”行之后。
上一个将版本放在“服务器支持”组的中间。

我没有将其移至底部,而是将其移至顶部。
版本可能会在顶部更加突出,因为我们将在功能之后进行更多调试。

fetch-pack:打印所有相关的支持功能-v -v

当我们检查是否支持某些功能时,我们会以详细模式打印某些内容。
虽然有些功能没有打印出来(这让我觉得它不受支持;我更习惯了GIT_TRACE_PACKET)所以让我们把它们都打印出来

这是更多的代码。有人可能会争论打印服务器发送给我们的所有支持的功能。但我认为这种方式仍然很有价值,因为我们看到了客户关心的能力。

于 2015-04-02T07:30:05.397 回答