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


17

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

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

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

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


你为什么不ppa-purge先?
landroni 2014年

您可以重新安装该synaptic软件包。例如,如果使用,当您选择xyz软件包时,默认情况下将选择所有依赖关系。但是您可以始终取消选择所有依赖关系,而仅安装主软件包。稍后您可以安装所有依赖关系。仅当您准备重新安装时,此方法才有效。
注册用户

@landroni如果我清除,它将删除我不想删除的软件包。
RolandiXor

Answers:


13

我以前从未玩过这个游戏,但是我建议您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程序包创建虚拟程序包(名称可能略有不同)。然后,安装虚拟软件包应允许您在保留相关dep的同时删除“ true”软件包,然后安装旧版本。我不确定这将如何工作,但是请检查相关线程以获取详细信息:如何删除deb而不删除其依赖项


4

您可以首先将系统中安装的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)很大,则将打包输出的预期列表by保存apt-cache show <target-package-name>到任何要说的文件中,/path/to/foo然后apt-mark像这样使用组合:

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

这种方法可能有效,但是我没有标记100个以上的软件包,而是回答了另一个答案。
RolandiXor

@RolandiXor,可以使用apt-cache policy <target-package-name>具有包版本的列表,你可以降级/升级到..
精确的

..请参考对帖子所做的编辑;如果要标记的文件数量更多,则可以使用包含的命令组合...
精确到

我不认为你在理解我。无论如何,我现在已将其修复,并且已经发放了赏金(无法切换)。
RolandiXor

1

我刚刚经历了升级到软件包的上游版本然后决定降级的痛苦。这是通过维护者专用存储库。就我而言,这就是尝试使用最新的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是否需要btw,但这是我所做的)

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.