我在我的应用程序中实现了一个选项,使用--depth 1
来创建一个git repo的最小功能克隆,我只是意识到愚蠢的http传输并不是没有支持--depth
。我想自动检测http遥控器是哑还是智能,所以我可以在与dumb http repos交谈时省略--depth
选项。这可能吗?
或者,有没有直接的方法来检查git远程支持--depth
?
答案 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-advertisement
或x-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"
并使用返回码进行真/假测试。)