Saltar al contenido principal
InicioTutorialesGit

Git Prune: Qué es la poda Git y cómo usarla

La poda Git es un comando Git que elimina del repositorio los objetos que ya no son accesibles desde ninguna confirmación o rama, ayudando a liberar espacio en disco.
Actualizado 29 ago 2024  · 5 min leer

Gitevita la pérdida accidental de confirmaciones o datos importantes.

Sin embargo, esto puede hacer que permanezcan visibles datos obsoletos, como referencias a ramas eliminadas. Con el tiempo, los repositorios Git pueden acumular objetos sin referencia, que consumen espacio de disco innecesario y pueden causar confusión.

El comandogit prune es una utilidad doméstica dentro de Git, diseñada principalmente para limpiar objetos inalcanzables en el repositorio.

Un objeto inalcanzable es un objeto que no es accesible por ninguna rama, etiqueta, rama de seguimiento remoto u otra referencia. Estos objetos pueden consumir espacio en el repositorio, saturándolo con datos innecesarios a lo largo del tiempo.

Aunque git prune es una poderosa herramienta para mantener los repositorios limpios, la mayoría de los usuarios no necesitan utilizarla directamente debido a la recolección automática de basura de Git (git gc). Sin embargo, comprender su papel y función puede ser útil para usuarios avanzados de Git o en escenarios específicos en los que se requiera o prefiera el mantenimiento manual del repositorio.

Qué es git prune?

El comando git prune se utiliza para eliminar objetos que ya no son necesarios en el repositorio local. Estos objetos pueden ser commits, árboles (instantáneas de directorios), blobs (archivos) y etiquetas que ya no son accesibles desde ninguna rama o etiqueta del repositorio.

En pocas palabras, git prune ayuda a limpiar archivos y datos innecesarios en el repositorio, ahorrando espacio y reduciendo el desorden.

¿Cómo pueden volverse inalcanzables los objetos?

Los objetos pueden volverse inalcanzables de varias formas, por ejemplo, borrando ramas o reescribiendo confirmaciones. Cuando se eliminan ramas, cualquier confirmación exclusiva de esas ramas que no forme parte de ninguna otra rama o etiqueta, se vuelve inalcanzable.

La reescritura de commits, mediante comandos como git rebase, genera nuevos commits y descarta los antiguos, haciendo que también se vuelvan inalcanzables.

Periodo de gracia y reflogs

Git mantiene un registro de las actualizaciones de las puntas de rama y otras referencias llamado reflogs (registros de referencias). Podemos verlo utilizando el comando git reflog.

Aunque un objeto sea inalcanzable, si todavía está en el reflog, no será eliminado por git prune.

Por defecto, el reflog tiene una fecha de caducidad de 90 días, lo que proporciona un periodo de gracia durante el cual los objetos inalcanzables se almacenan temporalmente y no se podan inmediatamente.

Cuándo utilizar git prune

En general, no necesitamos utilizar directamente git prune. Git tiene un mecanismo de recolección de basura que se ejecuta automáticamente después de algunos comandos para limpiar los archivos innecesarios y optimizar la eficiencia del repositorio local comprimiendo algunos archivos.

Sin embargo, puede que queramos limpiar nuestro repositorio manualmente, por ejemplo:

  • Después de realizar una operación que sabemos que creará objetos inalcanzables, como la eliminación de una rama. 
  • Queremos limpiar el espacio en disco inmediatamente.
  • Mantener el depósito ordenado y limpio en todo momento.

Recogida de basura con git gc

En lugar de la poda directa, suele recomendarse confiar en el mecanismo de recogida de basura, que no sólo realiza una git prune, sino que también optimiza el espacio comprimiendo los objetos.

Como ya se ha dicho, la recogida de basura se ejecutará automáticamente después de algunos comandos. Podemos invocar la recogida de basuras manualmente con el comando

git gc

Cómo utilizarlo git prune

Como git prune borrará datos, se recomienda ejecutarlo primero con la opción --dry-run.

git prune --dry-run

Esta opción enumerará los objetos que se podarían sin podarlos realmente. El resultado sería algo parecido a

0d7dff8258654c03a058987b3e63c86feca9200d commit
ea1380f52f0bfa0142e46767adfd56593681091a blob
fa91af78a1ab453c1d7632192b3ca8bf217ec711 commit

La salida indica que hay dos commits y un blob que son inalcanzables y se eliminarían. Tras asegurarnos de que no aparece ningún dato importante, podemos proceder a la limpieza:

git prune

En algunas situaciones, queremos limpiar el repositorio justo después de realizar una acción que sabemos que conducirá a objetos inalcanzables, como la eliminación de una rama. Podemos ejecutar git prune --dry-run, pero la salida sale vacía. La razón es que los commits eliminados siguen siendo referenciados en el reflog.

Si no queremos esperar a que caduquen desde el reflog, podemos caducarlas manualmente mediante el comando

git reflog expire --expire-unreachable=now --all

Vamos a desglosar las opciones que utilizamos:

  • La opción --expire-unreachable=now fija la fecha de caducidad de todos los objetos inalcanzables en ahora, con lo que caducan inmediatamente.
  • La opción --all se dirige a todas las entradas reflog del repositorio. Sin esta opción, tendríamos que especificar una ref concreta (como una rama o una etiqueta) sobre la que queremos operar.

git prune: Uso avanzado

Veamos algunas técnicas avanzadas, como especificar un tiempo de caducidad o podar archivos empaquetados.

Especificar un tiempo de caducidad

Puede que sólo queramos limpiar los objetos inalcanzables más antiguos, por ejemplo, podando sólo los objetos que tengan al menos dos semanas de antigüedad.

La opción --expire nos permite especificar una hora de corte. Git eliminará los objetos que hayan estado inalcanzables durante más de un tiempo especificado. El parámetro acepta diferentes formatos como "hace 2 semanas", "3 días", "ayer", etc., para proporcionar flexibilidad a la hora de especificar el periodo de caducidad.

Ejemplo de comando:

git prune --expire=2.weeks.ago

Podar archivos empaquetados

Git almacena objetos de dos formas principales: como archivos individuales (objetos sueltos) y en archivos empaquetados. El empaquetamiento es un mecanismo para ahorrar espacio y mejorar el rendimiento almacenando varios objetos en un solo archivo y eliminando la redundancia.

A veces, un objeto puede existir tanto suelto como empaquetado. Aunque esta redundancia no es perjudicial (más allá de ocupar un poco más de espacio en disco), puede que queramos limpiar estos objetos sueltos que también están empaquetados para recuperar espacio.

El comando git prune-packed elimina los objetos sueltos si ya están incluidos en un paquete. A diferencia de git prune, git prune-packed no toma ninguna opción como --expire . Simplemente limpia los objetos sueltos que ya han sido embalados.

Conclusión

A medida que utilicemos un repositorio, algunos objetos se volverán inalcanzables, provocando un uso innecesario del disco. Git gestiona esto mediante un sistema de recogida de basura que elimina los objetos inalcanzables tras un tiempo de inactividad.

El mecanismo de recogida de basura es ejecutado automáticamente por Git después de algunos comandos. Pero también podemos ejecutarlo manualmente utilizando el comando git gc. El proceso de recogida de basura no sólo eliminará los objetos inalcanzables mediante git prune, sino que también optimizará el espacio en disco comprimiendo algunos objetos.

Los usuarios avanzados de Git pueden querer mantener manualmente un repositorio limpio. El comando git prune permite borrar manualmente los objetos inalcanzables. Siempre debemos ejecutar git prune --dry-run antes de ejecutar git prune para tener una visión general de los objetos que se van a eliminar durante el proceso de poda.

Temas

Aprende control de versiones con estos cursos

Course

Introduction to Git

4 hr
39.3K
Familiarize yourself with Git for version control. Explore how to track, compare, modify, and revert files, as well as collaborate with colleagues using Git.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

tutorial

Git rename branch: Cómo cambiar el nombre de una rama local o remota

Aprende a renombrar ramas Git locales y remotas utilizando el terminal o la interfaz gráfica de usuario (GUI) de clientes populares como GitHub.
François Aubry's photo

François Aubry

tutorial

Tutorial de Git Revert y Git Reset para principiantes

Una guía tutorial para principiantes que muestra cómo utilizar los comandos Git Revert y Reset.
Zoumana Keita 's photo

Zoumana Keita

10 min

tutorial

Git pull force: Cómo sobrescribir una rama local con una remota

Aprende por qué git pull --force no es la mejor forma de sobrescribir una rama local con la versión remota, y descubre el método adecuado utilizando git fetch y git reset.
François Aubry's photo

François Aubry

tutorial

Tutorial de GIT Push y Pull

Aprende a realizar solicitudes de Git PUSH y PULL con GitHub Desktop y la línea de comandos.

Olivia Smith

13 min

tutorial

Tutorial de GitHub y Git para principiantes

Un tutorial para principiantes que muestra cómo funciona el control de versiones Git y por qué es crucial para los proyectos de ciencia de datos.
Abid Ali Awan's photo

Abid Ali Awan

17 min

tutorial

Cómo eliminar un elemento de una lista en Python

Comprende cómo eliminar elementos de una lista en Python. Familiarízate con métodos como remove(), pop() y del para la gestión de listas.
See MoreSee More