如何在不删除其家属的情况下降级包裹?

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

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

有没有办法手动降级包(可能是一个一个),并将它们的依赖包标记为不可移动(如果有意义),直到我完成?

PS这个问题: 如何通过apt-get降级包? 有点不同,并没有帮助这种情况。

我之前从未玩过这个,但我建议您hold (或lock )导致您遇到麻烦的依赖项版本。 这种方式具有更有限数量的可能解决方案,并且当您尝试降级其他包时可能不会感到困惑。


如果没有其他工作,你可以采取这个答案中建议的手动方法: 如何通过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以及如何安装旧版本的软件包,如液体2.2.2? 例如:

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

请参阅如何在不安装某些依赖项的情况下安装软件包? 举例来说(以及相应的警告):

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

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

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

  • 列出target-package的依赖项,建议和建议的包:

     apt-cache show  
  • 将包标记为手动安装

     sudo apt-mark manual  

    (将此用于所有依赖项,建议和建议。)

  • 删除目标包:

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

     apt-cache policy  
  • 安装所需包的目标版本:

     sudo apt-get install = 

    要么

     sudo apt-get -t= install  

PS。 如果依赖项/推荐/建议的包列表,即那些要用apt-mark的包很大,请将apt-cache show 的打包输出的预期列表保存到任何文件说/path/to/foo并在组合中使用apt-mark ,如下所示:

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

我刚刚经历了升级到包的上游版本然后决定降级的痛苦。 这是通过维护者私人存储库。 在我的情况下,这完全是关于尝试最新的systemd 233版本(尚未发布)。

关键是要了解您需要指定所有应降级的软件包。 如果你做对了,很有可能会做你想做的事。 如果你错过了什么,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