Alguna vez, cuando has ido a clonar un repositorio Git ¿has tenido la sensación de que te estabas descargando todo Internet de lo mucho que tardaba? No estás solo. Todos, tarde o temprano pasamos por esa experiencia desagradable de ver cómo nuestra conexión se arrastra mientras Git se baja hasta el último commit de hace años que, realmente no vamos a necesitar para nada. Pero no te preocupes, hay una forma de evitarlo: el modo de clonado superficial de Git o Git shallow clone.
En pocas palabras, un clonado superficial te trae solo los commits más recientes de un repositorio, en lugar de todo su historial. Hacer un Git shallow clone te da lo esencial de un repo, lo que necesitas aquí y ahora, sin todo el bagaje histórico que, seamos sinceros, probablemente nunca vas a mirar. Es perfecto para cuando quieres empezar a trabajar rápido o cuando tu disco duro está tan lleno que debes ahorrar cada byte que puedas. Es la forma ideal de clonar un repositorio para muchos casos, como veremos luego.
Gracias a esta técnica, podrás clonar ese proyecto gigante en cuestión de segundos en lugar de minutos, y ocupando muy poco espacio en disco.
Te voy a explicar qué es exactamente, cómo usarlo, y por qué podría convertirse en tu mejor amigo en el día a día.
Entendiendo Git shallow clone
Imagina que estás viendo una serie, pero que para ver el último capítulo tienes que descargarte la temporada completa. No tendría mucho sentido. Pues con Git hacemos esto casi siempre... ¿Por qué nos tenemos que descargar todo el historial de un proyecto cuando en el 99% de los casos solo vas a necesitar la última versión del código (o como mucho, unas pocas versiones anteriores)?
En términos técnicos, un shallow clone es una copia parcial de un repositorio Git que contiene solo una parte limitada del historial de commits. Cuando realizas un clonado superficial, especificas una "profundidad" (depth) que indica cuántos commits quieres incluir en tu copia local, contando desde el más reciente hacia atrás.
Imagina que estás clonando el repositorio de Linux (sí, el kernel). Con un clon completo, estarías descargando más de 1 millón de commits que se remontan hasta el principio de los tiempos: varios GB de historia. Si lo que quieres es ver el código más reciente y haces un shallow clone con una profundidad de 1, solo obtienes el último commit y sus archivos: unos pocos MB y unos segundos para traértelo. Mucho mejor 😉
Las principales diferencias entre un clonado normal y uno superficial son:
- Tamaño del repositorio: los shallow clones son mucho más pequeños porque solo contienen una parte del historial.
- Velocidad de clonado: al descargar menos información, el proceso es mucho más rápido. Es especialmente útil en entornos CI/CD donde el tiempo es oro (porque te lo cobran) y el espacio en disco también.
- Operaciones Git disponibles: algunas operaciones no estarán disponibles, como por ejemplo hacer un
git blame
más allá de tu profundidad establecida o un git rebase
con commits antiguos.
- Dependencia del servidor remoto: para operaciones que requieren acceso al historial completo, necesitarás conectarte al repositorio remoto, ya que no tienes toda la información en local.
Cómo utilizar los clonados superficiales de Git
Vamos a ponernos manos a la obra. El comando básico es súper sencillo:
git clone --depth 1 https://github.com/usuario/repositorio.git
En ese --depth 1
está toda la "magia". Le dices a Git: "dame solo el último commit".
Nota: pongo un ejemplo con GitHub pero esto sirve con cualquier repositorio Git, claro.
Es así de sencillo. Pero tenemos otras opciones interesantes...
¿Quieres traerte algunos commits más porque se te quedan cortos? Usa el comando fetch
para traerlos usando una profundidad mayor:
git fetch --depth=N
Si en un momento determinado te arrepientes del clonado superficial y quieres traerte la historia completa, no tienes que crear otra copia local del repo. Basta con que uses el comando contrario, unshallow
:
git fetch --unshallow
Así te descarga la historia completa.
Esto es lo básico. pero se puede ser más selectivo todavía. Por ejemplo, si solo vas a utilizar una rama del código, digamos main
, ¿para qué quieres traerte todas, aunque solo sean unos pocos commits?
Para clonar de manera superficial tan solo una rama concreta, simplemente indica qué rama te interesa con --branch
:
git clone --depth 1 --branch main https://github.com/usuario/repositorio.git
¿Y si lo que quieres es un tag
concreto? Por ejemplo, la última versión estable... Pues exactamente lo mismo:
git clone --depth 1 --branch v2.0.0 https://github.com/usuario/repositorio.git
Un truco que me encanta es combinar shallow clone con sparse checkout.
Un sparse checkout en Git es la funcionalidad que permite traerte tan solo algunos archivos y/o directorios concretos desde un repositorio, en lugar de descargar todo el contenido. Esto te permite reducir el espacio de almacenamiento y mejorar el rendimiento si solo tienes interés en ciertos archivos. Así que si lo combinamos con el clonado superficial para traernos solo una parte de los archivos del repo podemos adelgazar a tope el tamaño del repositorio local:
# Primero, hacemos el shallow clone
git clone --depth 1 --filter=blob:none https://github.com/usuario/repositorio.git
cd repositorio
# Configuramos sparse checkout
git sparse-checkout init
git sparse-checkout set carpeta/que/necesito
# Actualizamos el repositorio local
git pull
El truco aquí está en el modificador --filter=blob:none
del primer comando. Al ponerlo en un clonado es como decirle a Git: "De momento no me descargues ningún archivo, ya te diré cuáles quiero". Es súper útil si andas escaso de espacio en disco, te tienes que traer un repositorio muy grande pero solo necesitas un par de archivos 👏🏻👏🏻👏🏻
Casos de uso ideales para el shallow cloning
El shallow cloning es una técnica muy interesante que presenta grandes ventajas pero que, como todo, también tiene sus inconvenientes. Pero hay algunos casos concretos donde es fundamental:
- Entornos CI/CD: aquí el shallow clone es ideal. ¿Para qué necesitas toda la historia cuando solo vas a compilar y hacer test? Configura tu pipeline con:
git clone --depth 1 --single-branch --branch main tu-repo.git
Fíjate: en este caso le he puesto el modificador --single-branch
además de --branch
porque sin él clonaría todas las ramas del repositorio aunque solo se traería la información de la rama main
. Con este modificador solo descargará la información de la rama main
y no las demás, lo que ahorra (aunque sea poco) tiempo y espacio en disco.
- Servidores de despliegue: en producción, solo necesitas el código que vas a ejecutar. Punto. Un shallow clone con el tag de la versión específica es lo que necesitas:
git clone --depth 1 --branch v2.1.0 tu-repo.git
- Pruebas rápidas: ¿quieres probar rápidamente ese proyecto de GitHub que pesa varios GB? Usa shallow clone y ahórrate 20 minutos de descarga.
- Trabajo en itinerancia: si estás de viaje en el extranjero, conectado con el móvil u otro tipo de conexión lenta o que te cobra por transferencia, querrás traerte la menor cantidad de información posible.
Cuándo NO usar shallow clone
- Si estás desarrollando activamente en el proyecto. Básicamente porque te va a dificultar hacer merges de ramas y te va a complicar también el traerte cambios que otras personas hagan en el proyecto.
- Cuando necesitas acceso frecuente al historial completo
- Si trabajas con muchas ramas y merges complejos
- En proyectos pequeños donde el ahorro de espacio es insignificante
En resumen
El clonado superficial de repositorios en Git es una herramienta que, bien utilizada, puede transformar tu flujo de trabajo, especialmente en entornos automatizados. Como has visto a lo largo de este artículo, no se trata de sustituir los clonados tradicionales, sino usarlos de manera inteligente en las ocasiones apropiadas.
La clave está en el equilibrio: optimiza donde puedas y tenga sentido, mantén la historia completa donde la necesites, y sobre todo, asegúrate de entender cuándo y por qué estás usando cada enfoque. Al final, como con tantas otras cosas en desarrollo, no es la herramienta lo que importa, sino cómo la utilizas para hacer mejor y más eficiente tu trabajo.