Я установил несколько пакетов из PPA, и я хотел бы сейчас вернуться к официальным версиям. Многие из PPA больше не существуют в /etc/apt/sources.list.d
, поэтому ppa-purge
не будет работать на них.
Какой самый простой способ для этого?
Ну, вы можете удалить и переустановить пакеты
ppa-purge
, вероятно, по-прежнему ваш лучший выбор для чистого побега. Просто добавьте PPA, из которого пришел пакет, и затем используйте ppa-purge
для его уничтожения. Я не уверен, сколько PPA вы установили, но если их меньше 10, я бы смотрел на это.
Если вы считаете, что этот метод слишком мягкий, я только что написал несколько bash
-порогов, чтобы помочь идентифицировать версии пакетов, источник установки которых теперь существует только локально в /var/lib/dpkg/status
. Это не то же самое, что «осиротевшие» пакеты.
for p in `dpkg-query --showformat='${Package} ' -W`; do
if [[ $(apt-cache policy $p | grep -Pzo "\*\*\* [^\n]+\s+100") ]]; then
echo $p;
fi;
done
Я не уверен, что это идеально, но попробуй. Обратите внимание, что он будет только распечатывать имена пакетов. Вам придется вручную удалить / переустановить каждый пакет.
Для этого сначала посмотрите, что доступно для этого пакета, запустив apt-cache policy <package>
, и вы увидите список версий пакета (включая версию /var/lib/dpkg/status
). Найдите ближайший внешний и запустите:
sudo apt-get install <package>=<version>
Возможно, вам понадобится добавить --reinstall
после install
, но посмотрите, как оно идет.
Я написал более полный скрипт, который распознает пакеты, чья текущая версия не из PPA, и у них есть альтернативная версия, доступная для PPA. После запуска он печатает готовую к запуску команду, которая понизит версию таких пакетов до их версий 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}"