danirod

Control de versiones en dpkg

Es demasiado fácil perder el control sobre los paquetes instalados a través de un gestor de paquetes, sobre todo cuando esos paquetes tienen dependencias. Para evitar esto, la última vez que tuve que resetear mi workstation (equipada con Debian), hice un sistema para asegurar que tengo una manera de controlar qué paquetes entran y salen de mi ordenador.

En un directorio aislado del sistema creé un repositorio de Git. Después, fabriqué un script que cuando es llamado, vuelca la lista de paquetes instalados en un archivo dentro de ese repo y hace commit:

#!/bin/sh

cd /backups/dpkg
dpkg --get-selections > /backups/dpkg/selections.lst
git commit -am "Updating selection list after dpkg change"

Cada vez que se llame este script, si ha habido cambios en los paquetes instalados (no en sus versiones), se actualizará el archivo selections.lst y se hará un commit. Si no ha habido cambios, dirá nothing to commit, working tree clean, y ya.

Para que todo funcione como un reloj, configuré el script como un hook en apt. Creé un archivo en /etc/apt/apt.conf.d/06dpkghook con el siguiente contenido:

Dpkg::Post-Invoke { "if [ -x /sbin/dpkg-hook ]; then /sbin/dpkg-hook; fi" ; };

Un poco más complejo de lo que me gustaría, pero me venía bien controlar errores en este script. Aun así, como el código de retorno de git commit cuando no hay cambios es 1, y como mi script Bash no trata ese caso con un || return 0, a veces apt muestra mensajes de error un poco peculiares cuando hago un apt upgrade y no cambia la lista de paquetes instalados. Llevo 6 meses diciendo que tengo que editar el script, y aquí sigo.

No obstante, en general funciona que es una maravilla, y ya me ha permitido alguna vez detectar dependencias que no se eliminan bien al quitar el paquete que depende en ellas, o hacer rollbacks al instalar paquetes que causan problemas de estabilidad en mi workstation.

Captura de pantalla de tig
El repositorio con mis paquetes visualizado en tig.

Tengo pendiente portarlo a otros gestores de paquete, porque Homebrew en mi portátil personal es todavía más guarro con el tema dependencias y estoy harto de me cueste la vida hacer limpieza por no saber qué paquetes son dependencias y cuáles no.