是否有可能检测到http git遥控器是聪明还是愚蠢?

时间:2012-02-14 01:23:58

标签: git http

我在我的应用程序中实现了一个选项,使用--depth 1来创建一个git repo的最小功能克隆,我只是意识到愚蠢的http传输并不是没有支持--depth。我想自动检测http遥控器是哑还是智能,所以我可以在与dumb http repos交谈时省略--depth选项。这可能吗?

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

2 个答案:

答案 0 :(得分:6)

我相信自从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";
}

Content-Type标题字段x-git-receive-pack-advertisementx-git-upload-pack-advertisement表示智能http。

答案 1 :(得分:5)

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

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

您可以使用wget或curl来检查MIME类型:text / plain(dumb)与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"并使用返回码进行真/假测试。)