Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Git può trasportare dati su quattro famiglie di protocolli. Ognuna ha compromessi diversi in performance, autenticazione e amichevolezza con i firewall.

Locale / file

Clonare da una directory usa I/O di file locali. Due forme di URL:

git clone /srv/git/widget.git
git clone file:///srv/git/widget.git

La prima forma può usare hardlink per gli oggetti quando sullo stesso filesystem (molto veloce, molto efficiente in spazio). La forma file:// copia sempre via il protocollo smart.

SSH

Il default per workflow autenticati. Usa il tuo client SSH e la chiave:

git clone [email protected]:example/widget.git
git clone ssh://[email protected]/example/widget.git

Dietro le quinte, il client invoca ssh ed esegue git-upload-pack o git-receive-pack sul lato server. Configura le chiavi via ~/.ssh/config e ssh-agent.

HTTP / HTTPS

Più amichevole con i firewall e default per molti host:

git clone https://github.com/example/widget.git

Il protocollo HTTP smart usa POST /info/refs?service=git-upload-pack e endpoint simili. L'autenticazione è via Basic auth (deprecata in molti provider) o token nel campo password. Un credential helper evita prompt a ogni operazione:

git config --global credential.helper cache
git config --global credential.helper osxkeychain   # macOS
git config --global credential.helper manager       # Windows

git:// (anonimo)

git clone git://example.com/widget.git

Porta 9418, non autenticato, in chiaro. Perlopiù storico; non raccomandato per nuovi deployment perché non offre garanzie di integrità oltre agli hash di Git.

Versioni del protocollo

Il wire protocol ha v0, v1 e v2. Il protocollo v2 (Git 2.18+, default 2.26+) è drasticamente più veloce per repo con molti ref, perché il server pubblicizza solo i ref che il client ha richiesto.

git -c protocol.version=2 ls-remote origin
git config --global protocol.version 2

Smart vs dumb

I protocolli "smart" negoziano; il "dumb" HTTP espone solo la directory .git/. L'HTTP dumb richiede git update-server-info a ogni push ed è più lento; quasi nessuno lo usa oggi.

Scegliere un protocollo

  • HTTPS: il più facile da configurare, funziona ovunque, buono per read-only e CI.
  • SSH: il migliore per push/pull quotidiani quando controlli la tua chiave.
  • file://: comodo per mirror locali e test.
  • git://: evita tranne che per mirror pubblici estremamente permissivi.

Negoziazione delle capabilities

Al momento della connessione, client e server scambiano capabilities (multi-ack, side-band, ofs-delta, filter, partial clone, push-options, atomic, ecc.). Le capabilities supportate determinano quali funzionalità l'operazione può usare. Ispeziona con il packet tracing:

GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote origin 2>&1 | head -40

I server più vecchi possono non supportare capabilities più nuove; il client ricade con grazia. Se vedi clone o fetch sorprendentemente lenti, un server vecchio che manca di multi-ack-detailed o filter è spesso la causa.

Errori comuni

Mescolare URL HTTPS e SSH nello stesso repo; se una CI usa HTTPS ma il tuo dev usa SSH, gli script possono confondere l'uno con l'altro. O attieniti a uno o usa la riscrittura insteadOf:

git config --global url."[email protected]:".insteadOf "https://github.com/"

Memorizzare personal access token in config in chiaro; usa invece un credential helper. Dimenticare di abilitare protocol.version=2 su installazioni Git vecchie. Infine, esporre git:// sulla rete aperta per accesso in scrittura; il protocollo non può autenticare. Usa SSH o HTTPS.