2012-02-14 20 views
6

Benim uygulamada bir git repo en az işlevsel klonu yapmak için --depth 1 kullanmak için bir seçenek uygularıyorum ve sadece aptal http taşıma --depth desteklemediğini fark ettim. Bir http uzaktan aptal veya akıllı olup olmadığını otomatik olarak algılamak istiyorum, bu yüzden aptal http repos ile konuşurken --depth seçeneğini atlayabilirim. Mümkün mü?Bir http git uzaklığının akıllı mı yoksa aptal mı olduğunu tespit etmek mümkün mü?

Alternatif olarak, git uzaktan denetiminin --depth destekleyip desteklemediğini kontrol etmenin doğrudan bir yolu var mı?

+0

Ördek yazmayı kullanırdım: bir ördeğin olduğunu varsayalım ve gölete at, bir kedi olsaydı, ona üzgünüm (ve belki de havuza yeniden atmaktan kaçının). – redShadow

cevap

5

Tek yön, doğrudan HTTP sorgularıdır.

Akıllı destekli git istemcileri yakalanan ilk URL'nin sonuna bir argüman ekler, "[repo]/info/refs? Service = git-upload-pack". Aptal bir sunucu, "info/refs" dosyasını argümanı göz ardı eden bir metin olarak gönderir, bir akıllı sunucu ise "service = git-upload-pack" metni ve bir dizi özellik içeren refs listesinin önündeki bazı ikili verileri döndürür. ("derinlik" desteğini anlayabilirsiniz).

Bu akıllı/aptal testi, MIME türünü (text/plain (dumb) vs. application/x-git-upload-pack-advertisement (smart) ile karşılaştırmak için wget veya curl komutunu kullanarak komut dosyası oluşturabilirsiniz.

$ 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" Boru ve doğru/yanlış testi için dönüş kodu kullanabilirsiniz.) Ben git 1.8.2 beri, sen Content-Type başlığını kontrol edebilirsiniz inanıyoruz

+0

Ayrıca GIT_CURL_VERBOSE = 1 kullanabilirsiniz GIT_TRACE = 1 git clone --verbose --depth 1 repo_url curl yerine native git istemcisini kullanmak için (özel depoda kimlik doğrulaması da işleyen) – kontulai

6

.
commit git/git/4656bf47 bahseder edilir Bu yüzden:

şüpheli bir akıllı HTTP yanıt döndürdü Content-Type doğrulamak ayrıştırma önce standart eşleşir. Bu, bir müşterinin bir akıllı HTTP sunucusu yanıtı gibi kokan bir yükü işlemeye çalışmasını engeller.

Sen bu alanı ayarlamaya ilişkin bir örnek görebilirsiniz içinde sitaramc/gitolite/32d14d39 taahhüt:

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

Yani x-git-receive-pack-advertisement veya x-git-upload-pack-advertisement ile Content-Type başlık alanı akıllı http anlamına gelir.

İlgili konular