Como removo todos os pacotes de um determinado repositório?

30

Para uma atualização suave do 10.04 para o 10.10, eu gostaria de remover todos os pacotes que não estão nos repositórios padrão (por exemplo, PPA do Chromium e repositórios de terceiros). Qual é a maneira mais fácil (preferencialmente CLI) de encontrar e remover esses pacotes?

Edit: esta questão não se restringe aos PPAs, também tenho um repositório x2go, então estou procurando um comando genérico para remover pacotes pertencentes a um determinado repositório. Para PPAs, a pergunta Como remover PPAs tem ótimas respostas.

Lekensteyn
fonte
Para aqueles que desejam remover todos os pacotes externos, desative todos os PPAs e use code.google.com/p/apt-downgrade
Lekensteyn

Respostas:

12

Este script pode listar todos os pacotes de um servidor / filial específico (modificando as duas variáveis ​​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 }'

se você precisar listar todos os pacotes que não são de um servidor específico, independentemente da ramificação, substitua a penúltima linha por:

nextline == 1 { nextline = 0; if ($2 != server) print pkg }
enzotib
fonte
1
Não é exatamente o que estou procurando, esse script apenas exibe todos os pacotes de uma entrada específica do repositório. Ao substituir $2 == server && $3 == branchpor $2 != server, minha pergunta é respondida. Coloque isso na sua resposta :) (a branch=linha pode ser removida) Nota: assume-se que todos os pacotes vêm de um único servidor de repositório.
precisa saber é o seguinte
1
Este script (ligeiramente modificado pelo meu último comentário) funciona como esperado. O libvpx0pacote existia tanto no repositório principal quanto no PPA diário com cromo. Depois de remover os repositórios a partir /etc/apt/sources.list.d, eu ainda tinha um pacote de esquerda-over: libvpx0. I "reparado" isso da seguinte forma: remover a biblioteca com dpkg, ignorando dependências: sudo dpkg --ignore-depends=libvpx0 --remove libvpx0. Em seguida, instalá-lo novamente a partir do repo principal: sudo apt-get install libvpx0.
precisa saber é o seguinte
1
@Lekensteyn: provavelmente você poderia ter reduzido seu trabalho sudo apt-get install libvpx0=$version_string, supondo que os dois pacotes disponíveis tenham cadeias de versão diferentes.
enzotib
de fato, isso também era possível e talvez melhor também.
precisa saber é o seguinte
Eu só precisava verificar quais pacotes não estão instalados nos repositórios padrão. O 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.ubuntué um bom começo (adicione mais grep -vpara excluir determinados PPAs). As versões do pacote que não são conhecidas em nenhum repositório são exibidas como /var/lib/dpkg/status.
Lekensteyn
22

Confira ppa-purgeInstalar ppa-purge .

Uso:

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

O servidor de hosts padrão é ppa.launchpad.net.

Aqui está o link para a página de manual do ppa-purgecomandoÍcone da página de manual para referência.

Vadim Rutkovsky
fonte
Ou você pode usar meu ramo de ppa-purge, que possui muitas correções de bugs e melhorias em relação ao ppa-purge no repositório do universo. Veja aqui para mais informações.
jarno 20/11
18

Superando aptitudeo Bug Multiarch parappa-purge

Normalmente, como Vadim Rutkovsky e Takkat ter explicado , correndo ppa-purgecom a sintaxe padrão é uma maneira eficaz para remover todos os pacotes fornecidos por um PPA, degradando-os corretamente para versões fornecidas em outras fontes de software configurados sempre que possível.

No entanto, como Takkat apontou, o bug 831768 impede que ppa-purgefuncione corretamente para remover pacotes multiarch (como pacotes de 32 bits instalados em sistemas de 64 bits). Isso ocorre porque aptitudenão é possível lidar com dependências conflitantes em pacotes multiarch (esse é o problema do bug) e o comportamento padrão ppa-purgeé usar aptitudepara fazer o downgrade de pacotes.

Felizmente, ppa-purgeaceita a -ibandeira que faz com que preferem apt-geta aptitudecomo seu backend. Conforme documentado no relatório de erros, o uso de apt-geté uma alternativa eficaz à chamada manual aptitude, portanto, executar ppa-purgeo -isinalizador deve ser uma solução eficaz para remover / desclassificar todos os pacotes fornecidos por um PPA, incluindo pacotes multiarch .

Como fazer isso

Aqui está a sintaxe:

sudo ppa-purge -i ppa:ppaowner/ppaname

Como sempre (o mesmo que quando a -ibandeira não é usada):

  • ppaowner é substituído pelo proprietário do PPA.
  • /ppanameé opcional. Se presente, ppanameé substituído pelo nome do PPA. Caso contrário, o padrão é ppa.

Por exemplo , suponha que eu tenha o PPA instalado para versões instáveis ​​do qBittorrent instalado e deseje removê-lo completamente, fazendo o downgrade automático do qBittorrent para qualquer versão disponível nas minhas outras fontes de software, usando apt-getnos bastidores em vez deaptitude . Então eu corria:

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

Onde está documentado

Por alguma razão, algumas opções úteis para ppa-purgenão estão documentadas em sua página de manual , inclusive -i. Mas você pode obter informações sobre eles executando ppa-purge -h(ou apenas ppa-purgesem 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.

"A preferência reversa do apt-get upon aptitude" é um pouco enigmática. Ao olhar para a parte relevante do código fonte ( ppa-purgeé apenas um shell script, depois de tudo), podemos ver que isto significa que o comportamento padrão é a preferir aptitudea apt-get, ea -ibandeira inverte essa preferência.

Eliah Kagan
fonte
A última vez em que tentei o ppa-purge, ele não removeu os pacotes que foram excluídos dos PPAs. Ainda é esse o caso?
22412 Lekensteyn
@Lekensteyn Sim, eu acredito que ele ainda é o caso de que ppa-purgeirá não remover ou pacotes de downgrade que já não são fornecidos pelo PPA a ser "purgado". No entanto, você pode postar uma pergunta separada sobre isso, para obter uma resposta mais autorizada ou bem documentada.
Eliah Kagan
Se o repositório não for um PPA hospedado no Launchpad, mas outro repositório não padrão, o ppa-purge funcionará?
Anwar
1
@ Anwar, não tenho certeza se vai funcionar, mas você deve tentar especificar a URL do repositório completo em vez de ppa:username/path. Além disso, o PPA deve ser ATIVADO antes de você tentar limpá-lo, mesmo que o script seja desativado imediatamente após a atualização da lista de pacotes a serem removidos, ele não "encontrará" os PPAs já desativados.
dragon788
1
@Lekensteyn, você pode tentar usar aptitude search ~opara encontrar pacotes órfãos sem fonte de instalação, se precisar remover algo que foi removido de um PPA (ou foi instalado como único dpkg -i).
dragon788
6

Aqui estão maneiras GUI de fazer isso. Espero que ajude para aqueles que não preferem CLI. Os passos são simples e fáceis de seguir.

  1. Abra o gerenciador de pacotes sinápticos . Se não estiver instalado, instale-o:

    sudo apt-get install synaptic
    
  2. Quando aberto, clique no botão Origem na parte inferior esquerda. Ele listará todos os repositórios no lado superior esquerdo. Selecione o repositório específico para o qual os pacotes devem ser removidos. Ele listará todos os pacotes nesse repositório. Clique no primeiro campo i, e S ou no Versão Instalada para mostrar primeiro os pacotes instalados.

  3. Agora selecione todos os pacotes para remover.

    Dicas para marcar para remoção:

    1. Selecione o primeiro pacote, mantenha pressionada a Shifttecla e novamente selecione o último pacote para selecionar todos. Em seguida, clique com o botão direito na caixa quadrada e selecione a marca para remoção ou a marca para remoção completa .

    2. ou Selecione todos os pacotes e pressione Ctrl+ Apara selecionar todos. Em seguida, clique com o botão direito na caixa quadrada e escolha a marca para remoção ou a marca para remoção completa.

É isso aí. Ele será removido sem nenhum problema. Também anexei a imagem para torná-la mais clara. Espero que ajude. :)

imagem

Saurav Kumar
fonte
5

Para pelo menos encontrá-los, comece desativando os PPAs e execute apt-get update. Então instale apt-show-versions. A execução apt-show-versions | grep 'No available'fornecerá uma lista de todos os pacotes instalados que não podem ser encontrados nos repositórios configurados. Com alguma mágica da linha de comando, você provavelmente pode remover apenas os nomes dos pacotes e passá-los para apt-get remove:

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

Observe que isso percorrerá a lista retornada apt-show-versionse os removerá um a um. Dependendo do que encontrar, isso pode desinstalar algo não intencional devido a dependências, portanto verifique-o primeiro.

Egil
fonte
Parece bom, vou tentar.
Lekensteyn
3
O processo de atualização em si também irá desativar automaticamente os PPAs, embora eu tenha certeza que ele não removerá todo o restante dos pacotes.
Jorge Castro
@ Jorge: Eu realmente notei que os PPAs estão desativados (comentados), mas ele não remove os pacotes. Eu acho que é melhor remover os pacotes antes que uma nova versão dos repositórios do Ubuntu substitua os arquivos.
Lekensteyn
Acabei de testar isso e não faz distinção entre pacotes dos principais repositórios e um PPA. No meu caso, era o libvpx0pacote do PPA diário com cromo. A resposta do @ enzotib mostrou este pacote.
precisa saber é o seguinte
Se você executar apt-show-versionscomo não raiz, ele precisará sudo apt-show-versions -iatualizar seu cache e ver as alterações dos repositórios / PPAs removidos recentemente (caso contrário, ele será atualizado apenas por meio de um trabalho cron.daily)
Xen2050 em
0

Achei difícil usar o ppa-purge.

Abra o Synaptic Package Manager em Sistema e selecione Configurações, Repositórios.

Remova os que você não deseja.

Feito!

Joe
fonte
4
Isso remove apenas fontes de pacote, não remove o pacote dessas fontes.
Lekensteyn