apt 说包裹被退回了,怎么办?

Jar*_*sen 35 debian apt debian-jessie

的输出apt-get upgrade是:

The following packages have been kept back:
certbot python-acme python-certbot python-certbot-apache python-cryptography python-openssl
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我应该采取行动吗?如果是这样,是什么?

Gre*_*man 58

快速简便的解决方案:

我有同样的问题,好几次了。不要先做sudo apt-get dist-upgrade。很重要。****注意:此解决方案适用于基于 Debian 的机器,但不适用于KDE Neon。要更新 KDE Neon,您必须使用sudo pkcon update.****

为什么?

它会使您的系统非常不稳定,程序可能会崩溃,并且您可能会失去操作系统中的许多功能。

必须单独安装每个包,但是,在此过程中,其他依赖项也将自动安装,您的问题将在几分钟内得到解决。

我对以下解决方案没有任何问题。这是相当快速和容易的。


首先,这样做:

apt list --upgradable

  • 这将显示可以升级的软件包列表。

接下来,执行以下操作:

  • 从列表开头的第一个包开始,然后键入:

sudo apt-get install package-name-here

  • 这将贯穿安装过程并拉取/安装依赖项。

该过程完成后,执行以下操作:

apt list --upgradable

  • 这将再次显示哪些软件包可以升级。您的软件包列表现在应该在减少。按照包列表并apt list --upgradable在每个包安装后键入。这应该只需要几分钟即可完成。

最后:

sudo apt-get autoclean

sudo apt-get update && sudo apt-get dist-upgrade

如果此解决方案对您有用,请不要忘记对它进行投票,以便其他人可以使用正确的解决方案并且位于答案列表的顶部。

如果由于某种原因此解决方案对您不起作用,请参阅下面的用户 GAD3R 的回答。这也是一个很好的解决方案。

谢谢。

  • 对我来说,这个包是 ubuntu-minimal 的。你的指示非常有效。 (2认同)

GAD*_*D3R 13

这是什么意思?

The following packages have been kept back:
Run Code Online (Sandbox Code Playgroud)

答案在这里

这意味着这些软件包的新版本由于某种原因不会被安装。可能的原因是依赖关系中断(它所依赖的包没有可供下载的版本)或新的依赖项(该包自上一版本以来依赖于新包)。

我应该采取行动吗?

您需要使用dist-upgrade才能安装新的依赖项并升级软件包:

sudo apt-get dist-upgrade
Run Code Online (Sandbox Code Playgroud)

dist-upgrade如果不需要,可以通过运行来解决问题:

修复损坏的依赖项

sudo apt-get -f install 
Run Code Online (Sandbox Code Playgroud)

删除一些不再安装在您的系统上的软件包:

sudo apt-get autoclean
Run Code Online (Sandbox Code Playgroud)

保留所需的包:

echo "<package_name> hold" | dpkg --set-selections
Run Code Online (Sandbox Code Playgroud)

重新配置命名包:

dpkg-reconfigure <package_name>
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,“出于某种原因”是一种错误。恕我直言,Apt 应该告诉用户_为什么_包裹被扣留。就其价值而言,发生这种情况的原因之一似乎是所谓的“分阶段更新”——请参阅 https://wiki.ubuntu.com/PhasedUpdates——基本上,它试图阻止每个人同时更新,以防出现回归或其他什么情况。如果软件告诉我们这一点,然后稍后重试,或者提供强制执行或其他操作的选项,那么会节省多少时间?反正... (5认同)

Kar*_*tel 10

这篇文章很好地总结了为什么会发生这种情况:

如果您已安装的某个软件包的依赖关系已更改,因此必须安装新软件包才能执行升级,那么该软件包将被列为“保留”。

解决这个问题的方法是显式安装它们

sudo apt install [packages]
Run Code Online (Sandbox Code Playgroud)

您可能希望将这些软件包标记为自动安装,除非您自己关心它们而不仅仅是为了满足依赖关系。

sudo apt-mark auto [packages]
Run Code Online (Sandbox Code Playgroud)

为了从一开始就防止这种情况发生,我建议使用

sudo apt --with-new-pkgs upgrade
Run Code Online (Sandbox Code Playgroud)

将来升级软件包,这允许安装新软件包以满足依赖项的变化。


小智 8

来自Unix SE 的回答

首先,如上所述,请不要升级任何生产系统!虽然 dist-upgrading 将“解决”保留的软件包,但它绝对不是这个问题的解决方案,如果您在不知道对系统的影响的情况下运行它,很可能会给您带来更多的痛苦。

如果升级软件包需要安装额外的软件包,那么它将在运行时“保留” sudo apt-get upgrade

如上所述,您可以通过显式运行来手动安装这些“保留”的软件包sudo apt-get install [paste kept back packages here],但这会将这些软件包标记为“手动安装”,这通常不是我们想要的。

要自动安装升级“保留”软件包所需的任何其他软件包,同时不将“保留”软件包标记为手动安装,只需运行sudo apt-get --with-new-pkgs upgrade.