2012-02-14 60 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。

相關問題