我正在我的应用程序中实现一个选项,--depth 1用于制作git repo的最小功能克隆,我刚刚意识到哑传输不支持--depth.我想自动检测http遥控器是哑还是智能,所以我可以--depth在与dumb http repos交谈时省略该选项.这可能吗?
或者,有没有直接的方法来检查git遥控器是否支持--depth?
我相信自从git 1.8.2,你可以查看Content-Type标题.
这就是为什么提交git/git/4656bf47提到:
在解析可疑的智能HTTP响应之前,验证返回的是否
Content-Type与标准匹配.这可以防止客户端尝试处理有点像智能HTTP服务器响应的有效负载.
您可以在commit 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";
}
Run Code Online (Sandbox Code Playgroud)
因此Content-Type带有x-git-receive-pack-advertisement或x-git-upload-pack-advertisement表示智能http 的头字段.
一种方法是直接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
Run Code Online (Sandbox Code Playgroud)
(管道grep -q "^Content-Type: application/x-git"并使用返回码进行真/假测试.)