Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

Clona repositorios Git 10 veces más rápido: shallow clone

Imagen ornamental. Un desarrollador mirando su ordenador con Git Shadow Clone en pantalla

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:

  1. Tamaño del repositorio: los shallow clones son mucho más pequeños porque solo contienen una parte del historial.
  2. 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.
  3. 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.
  4. 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:

  1. 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.

  1. 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
  1. 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.
  2. 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.

José M. Alarcón Aguín Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José M. Alarcón Aguín
Archivado en: Herramientas

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.