2012-02-14 21 views
6

我在我的应用程序中实现了一个选项,使用--depth 1来创建git repo的最小功能克隆,并且我刚刚意识到哑巴http传输不支持--depth。我想自动检测一个http远程是否愚蠢或智能,所以我可以省略--depth选项时,与哑巴http回购谈话。这可能吗?是否可以检测到http git remote是智能还是愚蠢?

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

+0

我会用鸭子打字:假设它是一只鸭子,把它扔到池塘里,如果它是一只猫,问他对不起(也许避免把它重新扔到池塘里)。 – redShadow 2012-02-14 01:50:25

回答

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(smart)之间的脚本。

$ 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",并使用返回代码为真/假测试。)

+0

您也可以使用GIT_CURL_VERBOSE = 1 GIT_TRACE = 1 git clone --verbose --depth 1 repo_url使用本地git客户端而不是curl(它也处理私有存储库中的身份验证) – kontulai 2015-09-07 19:18:41

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"; 
} 

因此,与x-git-receive-pack-advertisementx-git-upload-pack-advertisement一个Content-Type头字段意味着智能HTTP。

相关问题