【问题标题】:How to detect whether a Git server supports shallow cloning?如何检测 Git 服务器是否支持浅克隆?
【发布时间】:2015-04-02 06:03:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: git github github-enterprise


    【解决方案1】:

    The smart protocol做了一些广告

    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 命令立即对其当前拥有的每个引用返回一行 - 在这种情况下,只有主分支及其 SHA-1。
    第一行还列出了服务器的功能(此处为报告状态、删除引用和其他一些功能,包括客户端标识符)。

    git 远程助手有options related to the shallow capability,但不清楚它们是否会像上面的 ssh 命令一样被通告。

    git 1.6.6 更新了包文件传输协议,包括“Reference Discovery”部分:

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

    $ 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 年后),git fetch -v -v 足以显示任何受支持的功能。

    参见Nguyễn Thái Ngọc Duy (pclouds)commit 0e04297commit 5a88583commit 0778b29(2019 年 6 月 20 日)。
    (由 Junio C Hamano -- gitster -- 合并于 commit b49d337,2019 年 7 月 9 日)

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

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

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

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

    当我们检查是否支持某些功能时,我们会打印一些内容 详细模式。
    虽然有些功能没有打印出来(这让我 认为不支持;我更习惯GIT_TRACE_PACKET) 所以让我们 全部打印出来

    代码有点多。有人可能会主张打印所有支持的 服务器发送给我们的能力。但是我觉得这个还是很有价值的 因为我们看到了客户关心的能力。

    【讨论】:

    • 我已经阅读了很多关于智能协议的内容,但我不确定这是否有帮助。我尝试对 GitHub(不是 Enterprise)运行 SSH git-receive-pack 命令,但它不会发回 shallow 功能,但 GitHub 支持浅克隆没有任何问题。
    • 我同意。我只是想提供一些线索,开始寻找在服务器端管理浅克隆的位置和方式。
    • 谢谢 - 这似乎是一个相当复杂的话题,我完全不明白为什么 GitHub Enterprise 似乎没有干净地支持这一点。
    • 正如你今天的其他问题所见,你有很多问题要问 github 支持;)
    • 确实 - 这是一场真正的噩梦 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2011-06-23
    • 2017-04-25
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多