Por Anónimo (no verificado) , 29 Abril 2026

Introducción

Git puede transportar datos sobre cuatro familias de protocolos. Cada uno tiene diferentes compromisos en rendimiento, autenticación y amabilidad con firewalls.

Local / file

Clonar desde un directorio usa I/O de archivo local. Dos formas de URL:

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

La primera forma puede usar hardlinks para los objetos cuando están en el mismo sistema de archivos (muy rápido, muy eficiente en espacio). La forma file:// siempre copia vía el protocolo smart.

SSH

El predeterminado para flujos autenticados. Usa tu cliente SSH y clave:

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

Detrás de escena, el cliente invoca ssh y ejecuta git-upload-pack o git-receive-pack en el lado del servidor. Configura claves vía ~/.ssh/config y ssh-agent.

HTTP / HTTPS

El más amigable con firewalls y predeterminado para muchos hosts:

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

El protocolo HTTP smart usa POST /info/refs?service=git-upload-pack y endpoints similares. La autenticación es vía Basic auth (deprecada en muchos proveedores) o token en el campo de contraseña. Un asistente de credenciales evita prompts en cada operación:

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

git:// (anónimo)

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

Puerto 9418, no autenticado, texto plano. Mayormente histórico; no recomendado para nuevos despliegues porque no ofrece garantías de integridad más allá de los hashes propios de Git.

Versiones de protocolo

El protocolo de cable tiene v0, v1 y v2. El protocolo v2 (Git 2.18+, predeterminado 2.26+) es dramáticamente más rápido para repos con muchas refs, porque el servidor solo anuncia las refs que el cliente solicitó.

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

Smart vs dumb

Los protocolos "smart" negocian; el HTTP "dumb" solo expone el directorio .git/. El HTTP dumb requiere git update-server-info en cada push y es más lento; casi nadie lo usa hoy.

Eligiendo un protocolo

  • HTTPS: el más fácil de configurar, funciona en todas partes, bueno para solo lectura y CI.
  • SSH: el mejor para push/pull diario cuando controlas tu clave.
  • file://: conveniente para mirrors locales y tests.
  • git://: evítalo excepto para mirrors públicos extremadamente permisivos.

Negociación de capacidades

Al momento de la conexión, el cliente y el servidor intercambian capacidades (multi-ack, side-band, ofs-delta, filter, partial clone, push-options, atomic, etc.). Las capacidades soportadas determinan qué características puede usar la operación. Inspecciona con tracing de paquetes:

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

Los servidores antiguos pueden no soportar capacidades más nuevas; el cliente cae con elegancia. Si ves clones o fetches sorprendentemente lentos, un servidor antiguo carente de multi-ack-detailed o filter es a menudo la causa.

Errores comunes

Mezclar URLs HTTPS y SSH en el mismo repo; si un CI usa HTTPS pero tu desarrollo usa SSH, los scripts pueden confundirse entre sí. O bien apégate a uno o usa reescritura insteadOf:

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

Almacenar tokens de acceso personal en config en texto plano; usa un asistente de credenciales en su lugar. Olvidar habilitar protocol.version=2 en instalaciones de Git antiguas. Finalmente, exponer git:// en el internet abierto para acceso de escritura; el protocolo no puede autenticar. Usa SSH o HTTPS.