2012-02-14 4 views
6

Sto implementando un'opzione nella mia applicazione per utilizzare --depth 1 per creare un clone funzionale minimo di un repository git, e ho appena realizzato che il trasporto stupido di http non supporta --depth. Mi piacerebbe rilevare automaticamente se un telecomando http è stupido o intelligente, quindi posso omettere l'opzione --depth quando si parla di repository http stupidi. È possibile?È possibile rilevare se un http git remote è intelligente o stupido?

In alternativa, esiste un modo diretto per verificare se un telecomando git supporta --depth?

+0

Userei la digitazione anatra: presumo che sia un'anatra e buttala nello stagno, se fosse un gatto, chiedigli scusa (e forse evita di rilanciarlo nello stagno). – redShadow

risposta

5

Un modo è tramite query HTTP dirette.

I client git con supporto intelligente aggiungono un argomento alla fine del primo URL afferrato, "[repo]/info/refs? Service = git-upload-pack". Un server stupido semplicemente invierà il file "info/refs" come testo ignorando l'argomento, mentre un server intelligente restituirà alcuni dati binari davanti all'elenco dei refs, incluso il testo "service = git-upload-pack" e un elenco di funzionalità (da cui potresti essere in grado di trovare il supporto per "profondità").

È possibile eseguire lo script di questo test smart/dumb utilizzando wget o curl per controllare il tipo MIME: text/plain (dumb) vs. 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 

(Tubo per grep -q "^Content-Type: application/x-git" e utilizzare il codice di ritorno del vero falso test /.)

+0

È inoltre possibile utilizzare GIT_CURL_VERBOSE = 1 GIT_TRACE = 1 git clone --verbose --depth 1 repo_url per utilizzare il client git nativo anziché curl (che gestisce anche l'autenticazione in caso di repository privato) – kontulai

6

Credo dal Git 1.8.2, è possibile controllare l'intestazione Content-Type.
Ecco perché commit git/git/4656bf47 menzioni:

Prima di analisi di un sospetto smart-HTTP di risposta verificare l'restituita Content-Type corrisponde allo standard. Ciò protegge un client dal tentativo di elaborare un payload che ha l'odore di una risposta del server smart-HTTP.

Si può vedere un esempio di impostazione che in campo commettono 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"; 
} 

Quindi un campo di intestazione con Content-Typex-git-receive-pack-advertisement o x-git-upload-pack-advertisement significa intelligente http.

Problemi correlati