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

Rya*_*son 6 git http

我正在我的应用程序中实现一个选项,--depth 1用于制作git repo的最小功能克隆,我刚刚意识到哑传输不支持--depth.我想自动检测http遥控器是哑还是智能,所以我可以--depth在与dumb http repos交谈时省略该选项.这可能吗?

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

Von*_*onC 6

我相信自从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-advertisementx-git-upload-pack-advertisement表示智能http 的头字段.


ems*_*rcy 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
Run Code Online (Sandbox Code Playgroud)

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