¿Cómo elimino todos los paquetes de un repositorio determinado?

30

Para una actualización sin problemas de 10.04 a 10.10, me gustaría eliminar todos los paquetes que no están en los repositorios predeterminados (por ejemplo, cromo PPA y repositorios de terceros). ¿Cuál es la forma más fácil (preferiblemente CLI) para encontrar y eliminar estos paquetes?

Editar: esta pregunta no está restringida a PPA, también tengo un repositorio x2go, así que estoy buscando un comando genérico para eliminar los paquetes que pertenecen a un determinado repositorio. Para los PPA, la pregunta ¿Cómo se pueden eliminar los PPA? Tiene excelentes respuestas.

Lekensteyn
fuente
Para aquellos que desean eliminar todos los paquetes externos, deshabilite todos los PPA y use code.google.com/p/apt-downgrade
Lekensteyn

Respuestas:

12

Este script puede enumerar todos los paquetes de un servidor / rama en particular (modificando las dos variables declaradas):

#!/bin/bash

server="http://it.archive.ubuntu.com/ubuntu/"
branch="maverick-updates/main"

apt-cache policy $(dpkg -l | awk 'NR >= 6 { print $2 }') |
  awk -v server="$server" -v branch="$branch" \
    '/^[^ ]/      { split($1, a, ":"); pkg = a[1] }
    nextline == 1 { nextline = 0; if ($2 == server && $3 == branch) print pkg }
    /\*\*\*/      { nextline = 1 }'

Si necesita enumerar todos los paquetes que no provienen de un servidor en particular, independientemente de la sucursal, reemplace la penúltima línea con:

nextline == 1 { nextline = 0; if ($2 != server) print pkg }
enzotib
fuente
1
No es lo que estoy buscando exactamente, este script solo muestra todos los paquetes de una entrada de repositorio específica. Al reemplazar $2 == server && $3 == branchpor $2 != server, mi pregunta es respondida. Ponga eso en su respuesta :) (la branch=línea se puede eliminar) Nota: se supone que todos los paquetes provienen de un único servidor de repositorio.
Lekensteyn
1
Este script (ligeramente modificado por mi último comentario) funciona como se esperaba. El libvpx0paquete existía tanto en el repositorio principal como en el PPA de cromo diario. Después de la eliminación de los depósitos de /etc/apt/sources.list.d, todavía tenía un paquete sobrante: libvpx0. I "reparado" de la forma siguiente: eliminar la biblioteca con dpkg, haciendo caso omiso de las dependencias: sudo dpkg --ignore-depends=libvpx0 --remove libvpx0. A continuación, volverlo a instalar desde el repositorio principal: sudo apt-get install libvpx0.
Lekensteyn
1
@Lekensteyn: probablemente podría haber acortado su trabajo sudo apt-get install libvpx0=$version_string, suponiendo que los dos paquetes disponibles tengan cadenas de versión diferentes.
enzotib
de hecho, eso también fue posible y quizás mejor también.
Lekensteyn
Solo necesitaba verificar qué paquetes no están instalados desde los repositorios predeterminados. El comando apt-cache policy $(dpkg -l | awk '/^ii/{print $2}') > policy.txt; awk '!/^ /{pkg=$1}check{print pkg, $2;check=0}/\*\*\*/{check=1} ' policy.txt | grep -v archive.ubuntues un buen comienzo (agregue más grep -vpara excluir ciertos PPA). Las versiones de paquetes que no se conocen en ningún repositorio aparecen como /var/lib/dpkg/status.
Lekensteyn
22

Echa un vistazo a ppa-purgeInstalar ppa-purge .

Uso:

ppa-purge -purge <nameofppa> [-s hostserver]

El servidor de host está predeterminado ppa.launchpad.net.

Aquí está el enlace a la página de manual para el ppa-purgecomandoIcono de página de manual de referencia.

Vadim Rutkovsky
fuente
O podría usar mi rama de ppa-purge que tiene muchas correcciones de errores y mejoras sobre la ppa-purge en el repositorio del universo. Ver aquí para más información.
jarno
18

Superar aptitudeel error multiarch parappa-purge

Normalmente, como Vadim Rutkovski y Takkat han explicado , corriendo ppa-purgecon la sintaxis predeterminada es una forma efectiva de eliminar todos los paquetes proporcionados por un PPA, ellos degradar correctamente a las versiones proporcionadas en otras fuentes de software configuradas siempre que sea posible.

Sin embargo, como ha señalado Takkat, el error 831768 impide que ppa-purgefuncione correctamente para eliminar paquetes multiarch (como los paquetes de 32 bits instalados en sistemas de 64 bits). Esto se debe a aptitudeque no puede manejar dependencias conflictivas en paquetes multiarch (de eso se trata el error), y el comportamiento predeterminado de ppa-purgees usar aptitudepara degradar paquetes.

Afortunadamente, ppa-purgeacepta la -ibandera que hace que se prefiera apt-geta aptitudecomo motor. Como se documenta en el informe de error, el uso apt-getes una alternativa efectiva a la invocación manual aptitude, por lo que ejecutar ppa-purgecon el -iindicador debería ser una solución efectiva para eliminar / degradar todos los paquetes proporcionados por un PPA, incluidos los paquetes multiarch .

Cómo hacerlo

Aquí está la sintaxis:

sudo ppa-purge -i ppa:ppaowner/ppaname

Como de costumbre (igual que cuando -ino se usa la bandera):

  • ppaowner se reemplaza con el dueño del PPA.
  • /ppanamees opcional. Si está presente, ppanamese reemplaza con el nombre del PPA. Si no, por defecto es ppa.

Por ejemplo , supongamos que tengo instalado el PPA para compilaciones inestables de qBittorrent y quiero eliminarlo por completo, degradando automáticamente qBittorrent a cualquier versión disponible a través de mis otras fuentes de software que se utilizan apt-getdetrás de escenaaptitude . Entonces correría:

sudo ppa-purge -i ppa:hydr0g3n/qbittorrent-unstable

Donde está documentado

Por alguna razón, algunas opciones útiles para ppa-purgeno están documentadas en su página de manual , incluyendo -i. Pero puede obtener información sobre ellos ejecutando ppa-purge -h(o simplemente ppa-purgesin argumentos):

ek@Del:~$ ppa-purge -h
Usage: sudo ppa-purge [options] <ppa:ppaowner>[/ppaname]

ppa-purge will reset all packages from a PPA to the standard
versions released for your distribution.

Options:
    -p [ppaname]        PPA name to be disabled (default: ppa)
    -s [host]       Repository server (default: ppa.launchpad.net)
    -d [distribution]   Override the default distribution choice.
    -y          Pass -y --force-yes to apt-get or -y to aptitude
    -i          Reverse preference of apt-get upon aptitude.
    -h          Display this help text

Example usage commands:
    sudo ppa-purge xorg-edgers
    will remove https://launchpad.net/~xorg-edgers/+archive/ppa

    sudo ppa-purge -p xorg-testing sarvatt
    will remove https://launchpad.net/~sarvatt/+archive/xorg-testing

    sudo ppa-purge ppa:ubuntu-x-swat/x-updates
    will remove https://launchpad.net/~ubuntu-x-swat/+archive/x-updates

Notice: If ppa-purge fails for some reason and you wish to try again,
(For example: you left synaptic open while attempting to run it) simply
uncomment the PPA from your sources, run apt-get update and try again.

La "preferencia inversa de apt-get upon aptitude" es un poco críptica. Al observar la pieza relevante del código fuente ( ppa-purgees sólo un script de shell, después de todo), podemos ver que esto significa que el comportamiento por defecto es preferir aptitudea apt-get, y la -iseñal revierte esta preferencia.

Eliah Kagan
fuente
La última vez que probé ppa-purge, no eliminó los paquetes que se han eliminado de PPA. ¿Sigue siendo el caso?
Lekensteyn
@Lekensteyn Sí, yo creo que es todavía el caso de que ppa-purgese no eliminar o degradar los paquetes que ya no son proporcionados por el PPA siendo "purgado". Sin embargo, es posible que desee publicar una pregunta por separado sobre esto, para obtener una respuesta más autorizada o bien documentada.
Eliah Kagan
Si el repositorio no es un PPA alojado en Launchpad, sino otro repositorio no estándar, ¿funcionará ppa-purge?
Anwar
1
@Anwar No estoy seguro de que funcione, pero deberías poder intentarlo especificando la URL del repositorio completo en lugar de ppa:username/path. Además, el PPA debe estar HABILITADO antes de intentar purgarlo, aunque el script se deshabilita inmediatamente después de actualizar la lista de paquetes para eliminar, no "encontrará" PPA ya deshabilitados.
dragon788
1
@Lekensteyn puede intentar usar aptitude search ~opara encontrar paquetes huérfanos sin fuente de instalación si necesita purgar algo que se eliminó de un PPA (o se instaló como una vía única dpkg -i).
dragon788
6

Aquí hay formas GUI para hacerlo. Espero que ayude a aquellos que no prefieren CLI. Los pasos son simples y fáciles de seguir.

  1. Abra el administrador de paquetes sinápticos . Si no está instalado, instálelo de la siguiente manera:

    sudo apt-get install synaptic
    
  2. Cuando se abre, haga clic en el botón Origen en la parte inferior izquierda. Enumerará todos los repositorios en el lado superior izquierdo. Seleccione el repositorio particular para el que se eliminarán los paquetes. Enumerará todos los paquetes en ese repositorio. Haga clic en el primer campo i, e S o en el campo Versión instalada para mostrar primero los paquetes instalados.

  3. Ahora seleccione todos los paquetes para eliminar.

    Consejos para marcar para la eliminación:

    1. Seleccione el primer paquete, luego mantenga presionada la Shifttecla y nuevamente seleccione el último paquete para seleccionar todo. Luego haga clic derecho en el cuadro cuadrado y seleccione marcar para eliminar o marcar para eliminar por completo .

    2. o Seleccione cualquier paquete y presione Ctrl+ Apara seleccionar todo. Luego haga clic derecho en el cuadro cuadrado y elija marcar para eliminar o marcar para eliminar por completo.

Eso es. Se eliminará sin ningún problema. También adjunté la imagen para que quede más clara. Espero que ayude. :)

imagen

Saurav Kumar
fuente
5

Para al menos encontrarlos, comience deshabilitando los PPA y ejecute apt-get update. Luego instalar apt-show-versions. La ejecución apt-show-versions | grep 'No available'le dará una lista de todos sus paquetes instalados que no se pueden encontrar en sus repositorios configurados. Con algo de magia en la línea de comandos, probablemente pueda eliminar solo los nombres de los paquetes y pasarlos a apt-get remove:

 for i in `apt-show-versions | grep 'No available' | cut -d' ' -f 1` ; do  sudo apt-get remove -y $i ; done

Tenga en cuenta que esto irá a través de la lista devuelta apt-show-versionsy los eliminará uno por uno. Dependiendo de lo que encuentre, esto podría desinstalar algo no deseado debido a dependencias, así que verifíquelo primero.

Egil
fuente
Suena bien, lo intentaré.
Lekensteyn el
3
El proceso de actualización en sí mismo también permitirá que los PPA se puedan autoactivar, aunque estoy bastante seguro de que no eliminará todos los paquetes restantes.
Jorge Castro
@Jorge: De hecho, he notado que los PPA están deshabilitados (comentados), pero no elimina los paquetes. Creo que es mejor eliminar los paquetes antes de que una nueva versión de los repositorios de Ubuntu sobrescriba los archivos.
Lekensteyn
Acabo de probar esto y no distingue entre paquetes de los repositorios principales y un PPA. En mi caso, fue el libvpx0paquete del PPA de cromo diario. La respuesta de @ enzotib mostró este paquete.
Lekensteyn
Si se ejecuta apt-show-versionscomo no root, necesita sudo apt-show-versions -iactualizar su caché y ver los cambios de los repositorios / PPA recién eliminados (de lo contrario, solo se actualiza a través de un trabajo cron.daily)
Xen2050
0

Encontré el uso de ppa-purge difícil.

Abra Synaptic Package Manager en Sistema, luego seleccione Configuración, Repositorios.

Elimina los que no quieres.

¡Hecho!

Joe
fuente
44
Esto elimina solo las fuentes del paquete, no elimina el paquete de esas fuentes.
Lekensteyn