我怎样才能降级软件包而不删除其依赖项?

我怎样才能降级软件包而不删除其依赖项?

在清除 PPA 以便升级系统之前,我已将多个 mesa 软件包升级到 PPA 版本。版本之间的差异很小(从技术上讲它们是相同的,只有一组库来自 git,其他是最终版本)。

如果我尝试通过 Synaptic、apt-get 或 aptitude 降级,我就会陷入依赖地狱。

有没有办法手动降级软件包(也许一个接一个)并将其依赖的软件包标记为不可移动(如果有意义的话)直到​​我完成?

PS这个问题:如何通过 apt-get 降级软件包?有点不同,并且无助于解决这种情况。

答案1

我以前从未尝试过,但我建议您hold(或lock)更改导致问题的依赖项的版本。这种方式的apt解决方案数量较少,而且当您尝试降级其他软件包时可能不会感到困惑。


如果没有其他方法,您可以采用此答案中建议的手动方法:如何通过 apt-get 降级软件包?基本上,手动下载必要的软件包,然后使用较低级别和其强制参数之一.deb逐个安装它们: 、、甚至。dpkg--ignore-depends--force-depends--force-depends-version--force-all

本着与上述相同的精神,您可以提出以下--force-downgrade论点:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

但这假设您已经阅读过man dpkg,并且您了解自己要做什么:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

错误:版本号不是以数字开头如何安装旧版本的 Java如何安装旧版本的软件包(如 liquid 2.2.2)?例如:

sudo dpkg --force-downgrade -i your_mesa_package.deb

看看如何在不安装某些依赖项的情况下安装包?举个例子(以及适当的警告):

sudo dpkg --force-all -i your_mesa_package.deb

另一种方法是.deb使用该equivs包创建一个虚拟包(可能名称略有不同)。然后安装虚拟包应该允许您删除“真实”包,同时保留相关依赖项,然后安装旧版本。我不确定这究竟是如何工作的,但请查看此相关线程以了解详细信息:如何删除 deb 而不删除其依赖项

答案2

您可以首先使用apt-mark标记所有目标包的依赖项(也可能是推荐/建议的)安装在系统中手动的安装。完成此操作后,安装软件的先前版本,并apt-get明确提及版本。

  • 列出目标包的依赖包、推荐包和建议包:

    apt-cache show <target-package-name>
    
  • 将软件包标记为手动安装

    sudo apt-mark manual <package-name(s)>
    

    (将其用于所有依赖项,推荐和建议。)

  • 删除目标包:

    sudo apt-get remove <target-package-name>
    
  • 要查看可以降级/升级到的软件包版本列表,请使用:

    apt-cache policy <target-package-name>
    
  • 安装所需包的目标版本:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    或者

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. 如果依赖项/推荐/建议包,即那些要标记的包apt-mark很大,通过保存打包输出的预期列表apt-cache show <target-package-name>到任何文件中,然后像这样组合/path/to/foo使用:apt-mark

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese

答案3

我刚刚经历了升级到软件包的上游版本然后决定降级的痛苦。这是通过维护者的私人存储库进行的。对我来说,这完全是为了尝试最新的 systemd 233 版本(尚未发布)。

关键是要明白你需要指定所有应该降级的软件包。如果你做对了,apt 很可能会按照你的要求做。如果你漏掉了什么,apt 会告诉你这个操作会导致很多软件包被删除。为了确保我们在实际执行降级之前使用“-s”标志来尝试降级。

您需要采取的步骤如下:

1)列出所有升级到上游的依赖项(如果您的情况不同,请使用其他关键字):

dpkg -l|grep upstream

这将为您提供带有上游版本号的软件包列表。

2)列出每个软件包的正确稳定版本:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3)再次检查一切是否良好:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(不确定是否需要--reinstall,但这是我所做的)

4)删除-s并执行。

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

相关内容