Par Anonyme (non vérifié) , 29 avril 2026

Introduction

Git peut transporter des données sur quatre familles de protocoles. Chacun a différents compromis en performance, authentification et compatibilité avec les pare-feu.

Local / file

Cloner depuis un répertoire utilise les E/S locales. Deux formes d'URL :

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

La première forme peut utiliser des hardlinks pour les objets sur le même système de fichiers (très rapide, très efficace en espace). La forme file:// copie toujours via le smart protocol.

SSH

Le défaut pour les workflows authentifiés. Utilise votre client SSH et votre clé :

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

Dans les coulisses, le client invoque ssh et exécute git-upload-pack ou git-receive-pack côté serveur. Configurez les clés via ~/.ssh/config et ssh-agent.

HTTP / HTTPS

Le plus compatible avec les pare-feu et le défaut pour de nombreux hôtes :

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

Le smart HTTP utilise POST /info/refs?service=git-upload-pack et endpoints similaires. L'authentification est via Basic auth (déprécié chez de nombreux fournisseurs) ou token dans le champ mot de passe. Un assistant d'identifiants évite les invites à chaque opération :

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

git:// (anonyme)

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

Port 9418, non authentifié, en clair. Surtout historique ; non recommandé pour de nouveaux déploiements parce qu'il n'offre aucune garantie d'intégrité au-delà des hachages propres de Git.

Versions de protocole

Le protocole filaire a v0, v1 et v2. Le protocole v2 (Git 2.18+, défaut 2.26+) est dramatiquement plus rapide pour les dépôts avec de nombreuses refs, parce que le serveur n'annonce que les refs demandées par le client.

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

Smart vs dumb

Les protocoles « smart » négocient ; le HTTP « dumb » expose simplement le répertoire .git/. Le HTTP dumb nécessite git update-server-info à chaque push et est plus lent ; presque personne ne l'utilise aujourd'hui.

Choisir un protocole

  • HTTPS : le plus facile à configurer, fonctionne partout, bon pour la lecture seule et la CI.
  • SSH : le meilleur pour push/pull quotidien quand vous contrôlez votre clé.
  • file:// : pratique pour les miroirs locaux et les tests.
  • git:// : à éviter sauf pour les miroirs publics extrêmement permissifs.

Négociation de capacités

Au moment de la connexion, le client et le serveur échangent des capacités (multi-ack, side-band, ofs-delta, filter, partial clone, push-options, atomic, etc.). Les capacités supportées déterminent quelles fonctionnalités l'opération peut utiliser. Inspectez avec le traçage de paquets :

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

Les serveurs plus anciens peuvent ne pas supporter les capacités plus récentes ; le client retombe gracieusement. Si vous voyez des clones ou fetches étonnamment lents, un vieux serveur sans multi-ack-detailed ou filter en est souvent la cause.

Erreurs fréquentes

Mélanger HTTPS et SSH dans le même dépôt ; si une CI utilise HTTPS mais votre dev utilise SSH, les scripts peuvent se confondre. Soit tenez-vous-en à un seul, soit utilisez la réécriture insteadOf :

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

Stocker des tokens d'accès personnels en clair dans la configuration ; utilisez plutôt un assistant d'identifiants. Oublier d'activer protocol.version=2 sur les vieilles installations Git. Enfin, exposer git:// sur l'Internet ouvert pour l'accès en écriture ; le protocole ne peut pas authentifier. Utilisez SSH ou HTTPS.