¿Cómo revierto todos los paquetes a sus versiones oficiales?

10

He instalado varios paquetes de PPA y me gustaría volver a las versiones oficiales ahora. Muchas de las PPA ya no existen /etc/apt/sources.list.d, por ppa-purgelo que no funcionarán en ellas.

¿Cuál es la forma más directa para eso?

eudoxos
fuente

Respuestas:

11

Bueno, puedes eliminar y reinstalar los paquetes

ppa-purgeprobablemente sea su mejor apuesta para un escape limpio. Simplemente vuelve a agregar el PPA del que vino el paquete y luego lo usas ppa-purgepara matarlo. No estoy seguro de cuántos PPA ha instalado, pero si son menos de 10, estaría buscando hacerlo.

Si crees que ese método es demasiado suave, acabo de escribir algunos bash-porn para ayudar a identificar versiones de paquetes cuya fuente de instalación ahora solo existe localmente /var/lib/dpkg/status. Esto no es lo mismo que los paquetes "huérfanos".

for p in `dpkg-query --showformat='${Package} ' -W`; do
    if [[ $(apt-cache policy $p | grep -Pzo "\*\*\* [^\n]+\s+100") ]]; then
        echo $p;
    fi;
done

No estoy seguro de si esto es perfecto todavía, pero pruébalo. Tenga en cuenta que solo imprimirá los nombres de los paquetes. Tendrá que desinstalar / reinstalar manualmente cada paquete.

Para hacer eso, primero mire qué está disponible para ese paquete ejecutando apt-cache policy <package>y verá una lista de las versiones del paquete (incluida la /var/lib/dpkg/statusversión). Encuentra el externo más cercano y ejecuta:

sudo apt-get install <package>=<version>

Es posible que necesite agregar un --reinstalldespués de installpero ver cómo va.

Oli
fuente
1
@Jokerdino Eso es sutilmente (pero importante) diferente. Eso solo encuentra paquetes huérfanos, es decir, paquetes que no tienen un repositorio de instalación viable actual, por lo que solo mostrará cosas que ha instalado desde un PPA que no existen en otros lugares. Para cosas en las que actualiza los paquetes actuales (por ejemplo, si usó xorg-edgers para actualizar todo el sistema X), esos paquetes no se cuentan.
Oli
Lo siento. Acabo de notar eso y eliminé mi comentario (pero ya era demasiado tarde ...: /). Para referencia a otros que quieran seguir la conversación, me vinculé a esta respuesta .
jokerdino
Según la declaración oficial, ppa-purge se eliminó de ubuntu porque, apt-get puede realizar toda su funcionalidad. ¿Cómo puedo hacer esto con apt-get?
rafee
@rafee ¿Por qué crees que ppa-purgefue eliminado? Está en los repositorios para Trusty, así como en cualquier otra versión compatible .
Oli
Se elimina de la instalación predeterminada y requiere aptitud como dependencia.
rafee
1

He escrito un script más completo que reconocerá los paquetes cuya versión actual no es de un PPA, y tienen una versión alternativa disponible para PPA. Después de ejecutarse, imprime un comando listo para ejecutar que degradará dichos paquetes a sus versiones PPA.

https://gist.github.com/peci1/2d7859857fdad73ee8443f5ecd5ee5a3

#!/usr/bin/env bash

# BSD 3-clause license, copyright Martin Pecka @ 2019

# This script outputs a command that will revert all packages from non-PPA versions to their latest PPA version.
# This may be handy i.e. for finding packages for which you installed a newer version from a .deb file, or after
# incompletely removing a PPA.

export LC_ALL=C

command=""

for p in `dpkg-query --showformat='${Package} ' -W`; do
    if [[ $(apt-cache policy $p | grep -Pzo "\*\*\* [^\n]+\s+100") ]]; then
        versions=$(apt-cache policy $p | tr "\n" "\r" | grep -Po '(?<=\r )[ *]{3} [^\r]+ [0-9]+\r\s+[0-9]+' | sed 's/ [0-9]\+\r\s\+\([0-9]\+\)/ \1/g' | tr "\r" "\n")
        installable_versions=$(echo "${versions}" | grep -v " 100$")
        version_to_install=$(echo "${installable_versions}" | head -n1 | grep -Po "\s+\K.*(?= [0-9]+$)")
        if [[ ! -z "${version_to_install}" ]]; then
            echo "${p}=${version_to_install}"
            command="${command} ${p}=${version_to_install}"
        else
            echo "${p}: no PPA version"
        fi
    fi;
done

echo "To revert packages to their latest PPA version, call the following command as root. Please, carefully go through the list of changes apt-get will present to you!"
echo "apt-get install ${command}"
Martin Pecka
fuente