Jak usunąć wszystkie pakiety z określonego repozytorium?

30

W celu sprawnego uaktualnienia z 10.04 do 10.10 chciałbym usunąć wszystkie pakiety, które nie znajdują się w domyślnych repozytoriach (np. PPA chromu i repozytoria stron trzecich). Jaki jest najłatwiejszy (najlepiej CLI) sposób na znalezienie i usunięcie tych pakietów?

Edycja: to pytanie nie jest ograniczone do PPA, mam również repozytorium x2go, więc szukam ogólnego polecenia do usunięcia pakietów należących do określonego repozytorium. W przypadku umów PPA pytanie W jaki sposób można usunąć umowy PPA, zawiera świetne odpowiedzi.

Lekensteyn
źródło
Dla tych, którzy chcą usunąć wszystkie zewnętrzne pakiety, wyłącz wszystkie PPA i skorzystaj z code.google.com/p/apt-downgrade
Lekensteyn

Odpowiedzi:

12

Ten skrypt może wyświetlać wszystkie pakiety z określonego serwera / gałęzi (modyfikując dwie deklarowane zmienne):

#!/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 }'

jeśli chcesz wyświetlić listę wszystkich pakietów, które nie pochodzą z określonego serwera, niezależnie od oddziału, zamień wiersz przedostatni na:

nextline == 1 { nextline = 0; if ($2 != server) print pkg }
enzotib
źródło
1
Nie tego dokładnie szukam, ten skrypt wyświetla tylko wszystkie pakiety z określonej pozycji repozytorium. Poprzez zastąpienie $2 == server && $3 == branchprzez $2 != servermoje pytanie jest odpowiedź. Proszę wpisać to w swojej odpowiedzi :) ( branch=wiersz można usunąć) Uwaga: zakłada się, że wszystkie pakiety pochodzą z jednego serwera repozytorium.
Lekensteyn
1
Ten skrypt (nieco zmodyfikowany w stosunku do mojego ostatniego komentarza) działa zgodnie z oczekiwaniami. libvpx0Pakiet istniały zarówno głównego repo jak w PPA chromu dziennie. Po usunięciu z repozytoriów /etc/apt/sources.list.d, miałem jeszcze pakiet lewy-over: libvpx0. I „naprawione” to w następujący sposób: usunąć bibliotekę z dpkg, ignorując zależności: sudo dpkg --ignore-depends=libvpx0 --remove libvpx0. Następnie zainstalować go ponownie z głównego repo: sudo apt-get install libvpx0.
Lekensteyn
1
@ Lekensteyn: prawdopodobnie mógłbyś skrócić swoją pracę sudo apt-get install libvpx0=$version_string, zakładając, że dwa dostępne pakiety mają różne ciągi wersji.
enzotib
rzeczywiście było to również możliwe, a może i lepsze.
Lekensteyn
Musiałem tylko sprawdzić, które pakiety nie są instalowane z domyślnych repozytoriów. Polecenie 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.ubuntuto dobry początek (dodaj więcej, grep -vaby wykluczyć niektóre umowy PPA). Wersje pakietów, które nie są znane w żadnym repozytorium, są wyświetlane jako /var/lib/dpkg/status.
Lekensteyn
22

Sprawdź ppa-purgeZainstaluj ppa-purge .

Stosowanie:

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

Serwer hosta domyślnie to ppa.launchpad.net.

Oto link do strony podręcznika dla ppa-purgepolecenia wIkona strony celach informacyjnych.

Wadim Rutkowski
źródło
Lub możesz użyć mojej gałęzi ppa-purge, która ma wiele poprawek i ulepszeń w stosunku do ppa-purge w repozytorium wszechświata. Zobacz tutaj, aby uzyskać więcej informacji.
jarno
18

Pokonanie aptitudebłędu Multiarch dlappa-purge

Normalnie, jak Vadim Rutkovsky i Takkat zostały wyjaśnione , bieganie ppa-purgez domyślną składni jest skutecznym sposobem na usunięcie wszystkich pakietów dostarczonych przez PPA, odpowiednio do ich obniżenia wersji przewidzianych w innych skonfigurowanych źródeł oprogramowania w miarę możliwości.

Jednak, jak zauważył Takkat, błąd 831768 uniemożliwia ppa-purgepoprawne działanie w celu usuwania pakietów wielodostępowych (takich jak pakiety 32-bitowe zainstalowane w systemach 64-bitowych). Wynika to z faktu, że aptitudenie jest w stanie poradzić sobie z konfliktowymi zależnościami w pakietach wielościennych (o to właśnie chodzi w błędzie), a domyślnym zachowaniem ppa-purgejest używanie aptitudedo obniżania pakietów.

Na szczęście, ppa-purgeprzyjmuje -iflagę, która powoduje, że wolą apt-get, aby aptitudejako backend. Jak udokumentowano w raporcie o błędzie, używanie apt-getjest skuteczną alternatywą dla ręcznego wywoływania aptitude, więc uruchomienie ppa-purgez -iflagą powinno być skutecznym obejściem dla usuwania / obniżania poziomu wszystkich pakietów udostępnianych przez PPA, w tym pakietów wielościennych .

Jak to zrobić

Oto składnia:

sudo ppa-purge -i ppa:ppaowner/ppaname

Jak zwykle (tak samo, jak gdy -iflaga nie jest używana):

  • ppaowner zostaje zastąpiony właścicielem umowy PPA.
  • /ppanamejest opcjonalny. Jeśli jest obecny, ppanamezostaje zastąpiony nazwą PPA. Jeśli nie, domyślnie jest to ppa.

Załóżmy na przykład , że mam zainstalowany PPA dla niestabilnych wersji qBittorrent i chciałem go całkowicie usunąć, automatycznie obniżając qBittorrent do dowolnej wersji dostępnej za pośrednictwem moich innych źródeł oprogramowania, używając apt-getzamiast scenaptitude . Potem biegłbym:

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

Gdzie jest to udokumentowane

Z jakiegoś powodu na stronie podręcznikappa-purge nie udokumentowano kilku przydatnych opcji , w tym . Ale możesz uzyskać informacje na ich temat, uruchamiając (lub po prostu bez argumentów):-ippa-purge -hppa-purge

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.

„Odwrotna preferencja apt-get upon aptitude” jest nieco tajemnicza. Patrząc na danym kawałku kodu źródłowego ( ppa-purgejest tylko skrypt powłoki, mimo wszystko), widzimy, że to oznacza, że domyślnym zachowaniem jest wolą aptitudesię apt-get, a -iflaga odwraca tę preferencję.

Eliah Kagan
źródło
Ostatnim razem, gdy próbowałem ppa-purge, nie usunęło to pakietów, które zostały usunięte z PPA. Jest to ciągle aktualne?
Lekensteyn,
@Lekensteyn Tak, wierzę , że nadal jest tak, że ppa-purgebędzie nie usuwać lub obniżenia wersji pakietów, które nie są już przewidziane przez PPA są „oczyszczone”. Możesz jednak zadać osobne pytanie na ten temat, aby uzyskać bardziej wiarygodną lub dobrze udokumentowaną odpowiedź.
Eliah Kagan
Jeśli repozytorium nie jest PPA hostowanym w Launchpad, ale w innym niestandardowym repozytorium, czy ppa-purge będzie działać?
Anwar
1
@Anwar Nie jestem pewien, czy to zadziała, ale powinieneś spróbować, podając pełny adres URL repozytorium zamiast ppa:username/path. Ponadto PPA musi być WŁĄCZONE przed próbą wyczyszczenia, mimo że skrypt natychmiast wyłącza się po aktualizacji listy pakietów do usunięcia, nie „znajdzie” już wyłączonych PPA.
dragon788,
1
@ Lekensteyn możesz spróbować aptitude search ~oznaleźć osierocone pakiety bez źródła instalacji, jeśli chcesz wyczyścić coś, co zostało usunięte z PPA (lub zostało zainstalowane jako jednorazowo przez dpkg -i).
dragon788,
6

Oto sposoby GUI, aby to zrobić. Mam nadzieję, że pomoże to tym, którzy nie preferują CLI. Kroki są proste i łatwe do wykonania.

  1. Otwórz menedżera pakietów synaptycznych . Jeśli nie jest zainstalowany, zainstaluj go przez:

    sudo apt-get install synaptic
    
  2. Po otwarciu kliknij przycisk Początek w lewym dolnym rogu. Wyświetli listę wszystkich repozytoriów w lewym górnym rogu. Wybierz konkretne repozytorium, dla którego pakiety mają zostać usunięte. Wyświetli listę wszystkich pakietów w tym repozytorium. Kliknij pierwsze pole i, e S lub pole Zainstalowana wersja, aby najpierw wyświetlić zainstalowane pakiety.

  3. Teraz wybierz wszystkie pakiety do usunięcia.

    Wskazówki do oznaczenia do usunięcia:

    1. Wybierz pierwszy pakiet, a następnie przytrzymaj Shiftklawisz i ponownie wybierz ostatni pakiet, aby wybrać wszystkie. Następnie kliknij kwadratowe pole prawym przyciskiem myszy i wybierz znak do usunięcia lub znak do całkowitego usunięcia .

    2. lub Wybierz dowolne pakiety i naciśnij Ctrl+, Aaby zaznaczyć wszystkie. Następnie kliknij prawym przyciskiem myszy kwadratowe pole i wybierz znak do usunięcia lub znak do całkowitego usunięcia.

to jest to! Usunie się bez problemu. Dołączyłem również obraz, aby był bardziej wyraźny. Mam nadzieję, że to pomoże. :)

obraz

Saurav Kumar
źródło
5

Aby je przynajmniej znaleźć, zacznij od wyłączenia PPA i uruchom apt-get update. Następnie zainstaluj apt-show-versions. Uruchomienie apt-show-versions | grep 'No available'spowoduje wyświetlenie listy wszystkich zainstalowanych pakietów, których nie można znaleźć w skonfigurowanych repozytoriach. Przy pomocy magii wiersza poleceń prawdopodobnie możesz usunąć tylko nazwy pakietów i przekazać je do apt-get remove:

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

Pamiętaj, że przejdzie ona przez listę zwróconą z apt-show-versionsi usunie je jeden po drugim. W zależności od tego, co znajdzie, może to odinstalować coś niezamierzonego z powodu zależności, więc sprawdź to najpierw.

Egil
źródło
Brzmi nieźle, spróbuję.
Lekensteyn
3
Sam proces aktualizacji również automatycznie dezaktywuje pliki PPA, chociaż jestem pewien, że nie pójdzie i nie usunie wszystkich pozostałych pakietów.
Jorge Castro,
@Jorge: Rzeczywiście zauważyłem, że PPA są wyłączone (skomentowane), ale nie usuwa pakietów. Myślę, że lepiej jest usunąć pakiety, zanim nowa wersja z repozytoriów Ubuntu nadpisze pliki.
Lekensteyn
Właśnie to przetestowałem i nie robi to rozróżnienia między pakietami z głównych repozytoriów a PPA. W moim przypadku była to libvpx0paczka z codziennego chromu PPA. Odpowiedź @ enzotib pokazała ten pakiet.
Lekensteyn
Jeśli działasz apt-show-versionsjako użytkownik inny niż root, musi sudo apt-show-versions -izaktualizować pamięć podręczną i zobaczyć zmiany z nowo usuniętych repozytoriów / PPA (w przeciwnym razie jest aktualizowany tylko przez zadanie cron.daily)
Xen2050
0

Uznałem, że użycie ppa-purge jest trudne.

Otwórz Menedżera pakietów Synaptic w Systemie, a następnie wybierz Ustawienia, Repozytoria.

Usuń te, których nie chcesz.

Gotowy!

Joe
źródło
4
To usuwa tylko źródła pakietów, nie usuwa pakietu z tych źródeł.
Lekensteyn,