【问题标题】:Is it possible to detect whether a http git remote is smart or dumb?是否可以检测 http git 远程是智能还是愚蠢?
【发布时间】:2012-02-14 01:23:58
【问题描述】:

我在我的应用程序中实现了一个选项,以使用--depth 1 对 git repo 进行最小功能克隆,我刚刚意识到愚蠢的 http 传输不支持--depth。我想自动检测 http 遥控器是哑还是智能,这样我可以在与哑 http 存储库交谈时省略 --depth 选项。这可能吗?

或者,有没有直接的方法来检查 git 远程是否支持--depth

【问题讨论】:

  • 我会使用鸭子打字:假设它是一只鸭子,然后把它扔到池塘里,如果它是一只猫,向他道歉(并且可能避免将它重新扔到池塘里)。跨度>

标签: git http


【解决方案1】:

一种方法是通过直接 HTTP 查询。

支持智能的 git 客户端在抓取的第一个 URL 的末尾添加一个参数,“[repo]/info/refs?service=git-upload-pack”。愚蠢的服务器只会发送“info/refs”文件作为文本忽略参数,而智能服务器将在 refs 列表前面返回一些二进制数据,包括文本“service=git-upload-pack”和功能列表(您也许可以从中找出“深度”支持)。

您可以使用 wget 或 curl 编写此智能/哑测试脚本来检查 MIME 类型:text/plain(哑)与 application/x-git-upload-pack-advertisement(智能)。

$ curl -si http://github.com/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: application/x-git-upload-pack-advertisement
$ curl -si http://git.kernel.org/pub/scm/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: application/x-git-upload-pack-advertisement
$ curl -si http://repo.or.cz/r/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: text/plain

(管道到grep -q "^Content-Type: application/x-git" 并使用返回码进行真/假测试。)

【讨论】:

  • 您也可以使用 GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone --verbose --depth 1 repo_url 来使用本机 git 客户端而不是 curl(在私有存储库的情况下也可以处理身份验证)
【解决方案2】:

我相信从 git 1.8.2 开始,您可以检查 Content-Type 标头。
这就是为什么commit git/git/4656bf47 提到:

在解析可疑的智能 HTTP 响应之前,请验证返回的 Content-Type 是否符合标准。这可以防止客户端尝试处理闻起来像智能 HTTP 服务器响应的有效负载。

您可以在提交sitaramc/gitolite/32d14d39 中看到设置该字段的示例:

my $service = ( $ENV{SSH_ORIGINAL_COMMAND} =~ /git-receive-pack/ ? 'git-receive-pack' : 'git-upload-pack' );

if ($service) {
    print "Content-Type: application/x-$service-advertisement\r\n";
}

所以带有x-git-receive-pack-advertisementx-git-upload-pack-advertisementContent-Type 标头字段表示智能http。


另一种方式:

在 Git 2.26(2020 年第一季度)之前,HTTP walker 协议上的“git fetch”没有显示任何进度输出。

现在,我们本来就不知道还有多少工作要做,但我们仍然可以展示一些不让用户感到厌烦的东西。

参见René Scharfe (rscharfe)commit 7655b41(2020 年 3 月 3 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 4a5c3e1,2020 年 3 月 9 日)

remote-curl: 显示通过哑 HTTP 获取的进度

签字人:René Scharfe

通过哑 HTTP 传输进行获取不会显示任何进展,即使使用选项 --progress

如果连接速度很慢或者要获取大量数据,那么这可能需要很长时间,而用户会怀疑 git 是否卡住了。

我们一开始不知道要获取的对象数量,但我们可以数出我们得到的对象。

如果用户要求,则根据该数字显示一个开放式进度指示器。

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 2019-01-22
    • 2013-08-14
    • 2019-01-18
    • 2012-06-24
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多