Jak przywrócić wszystkie pakiety do ich oficjalnych wersji?

10

Zainstalowałem wiele pakietów z PPA i chciałbym teraz powrócić do oficjalnych wersji. Wiele umów PPA już nie istnieje /etc/apt/sources.list.d, więc ppa-purgenie będą nad nimi działały.

Jaki jest najprostszy sposób na to?

eudoksos
źródło

Odpowiedzi:

11

Możesz usunąć i ponownie zainstalować pakiety

ppa-purgejest prawdopodobnie najlepszym wyborem na czystą ucieczkę. Wystarczy ponownie dodać PPA, z którego pochodzi pakiet, a następnie użyć go, ppa-purgeaby go zabić. Nie jestem pewien, ile zainstalowanych PPA, ale jeśli jest ich mniej niż 10, chciałbym to zrobić.

Jeśli uważasz, że ta metoda jest zbyt miękka, właśnie napisałem bash-porn, aby pomóc zidentyfikować wersje pakietów, których źródło instalacji jest teraz dostępne tylko lokalnie /var/lib/dpkg/status. To nie to samo, co „osierocone” pakiety.

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

Nie jestem pewien, czy jest to jeszcze idealne, ale spróbuj. Uwaga: wydrukuje tylko nazwy pakietów. Będziesz musiał ręcznie odinstalować / ponownie zainstalować każdy pakiet.

Aby to zrobić, najpierw sprawdź, co jest dostępne dla tego pakietu, uruchamiając, apt-cache policy <package>a zobaczysz listę wersji pakietu (w tym /var/lib/dpkg/statuswersji). Znajdź najbliższy zewnętrzny i uruchom:

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

Może być konieczne dodanie --reinstallpo, installale zobacz, jak to idzie.

Oli
źródło
1
@Jokerdino To jest subtelnie (ale co ważne) inne. Znajduje tylko osierocone pakiety, to znaczy pakiety, które nie mają aktualnego realnego repozytorium instalacji, więc pokaże tylko rzeczy, które zainstalowałeś z PPA, które nie istnieją nigdzie indziej. W przypadku rzeczy, w których uaktualniasz bieżące pakiety (np. Jeśli użyłeś xorg-edgerów do uaktualnienia całego systemu X), te pakiety nie są liczone.
Oli
Przepraszam. Właśnie to zauważyłem i usunąłem swój komentarz (ale było już za późno ..: /). W celu odniesienia się do innych osób, które mogą chcieć śledzić rozmowę, zamieściłem link do tej odpowiedzi .
jokerdino
Zgodnie z oficjalnym oświadczeniem ppa-purge zostało usunięte z Ubuntu, ponieważ całą jego funkcjonalność można wykonać przez apt-get. Jak mogę to zrobić za pomocą apt-get.
rafee
@rafee Dlaczego Twoim zdaniem ppa-purgezostał usunięty? Znajduje się w repozytoriach Trusty, a także w każdej innej obsługiwanej wersji .
Oli
Jest usunięty z domyślnej instalacji i wymaga umiejętności jako zależności.
rafee
1

Napisałem bardziej kompletny skrypt, który rozpozna pakiety, których bieżąca wersja nie pochodzi z PPA, i mają alternatywną wersję dostępną dla PPA. Po uruchomieniu drukuje gotowe do uruchomienia polecenie, które obniży takie pakiety do ich wersji 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
źródło