如何将所有软件包恢复为其官方版本?

如何将所有软件包恢复为其官方版本?

我已经从 PPA 安装了许多软件包,现在想恢复到官方版本。许多 PPA 不再存在/etc/apt/sources.list.d,因此ppa-purge无法使用它们。

最直接的方法是什么?

答案1

那么你可以删除并重新安装软件包

ppa-purge可能仍然是您彻底退出的最佳选择。只需重新添加软件包来源的 PPA,然后使用ppa-purge它来终止它。我不确定您安装了多少个 PPA,但如果少于 10 个,ID正在考虑这么做。

如果您认为该方法太过软弱,我刚刚编写了一些bash-porn 来帮助识别安装源现在仅存在于本地的软件包版本/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,但要看看情况如何。

答案2

我编写了一个更完整的脚本,它可以识别当前版本不是来自 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}"

相关内容