我刚刚为GIMP的开发版本添加了一个PPA存储库,但出现此错误:

$ apt-get update && apt-get upgrade
...
The following packages have been kept back:
  gimp gimp-data libgegl-0.0-0 libgimp2.0


为什么以及如何解决它,以便可以使用最新版本,而不是现在的版本?

评论

严格来说,我想说的是警告,而不是错误。

#1 楼

根据debian-administration.org上的一篇文章,


如果您已安装的其中一个软件包的依存关系已更改,则必须安装新软件包才能执行升级,将被列为“保留”。


谨慎的解决方案1:

根据Pablo的回答,您可以运行sudo apt-get --with-new-pkgs upgrade,它将安装保留的-返回软件包。

这样做的好处是不会将保留的软件包标记为“手动安装”,这可能迫使更多的用户干预(请参见注释)。

如果Pablo的解决方案适合您,请对其进行投票。如果不是,请评论出了什么问题。

谨慎的解决方案2:

谨慎的解决方案是运行sudo apt-get install <list of packages kept back>。在大多数情况下,这将为保留的软件包提供成功升级所需的软件。

积极的解决方案:

更积极的解决方案是运行sudo apt-get dist-upgrade,这将强制执行安装这些新的依赖项。

但是dist-upgrade可能非常危险。与升级不同,它可能会删除软件包以解决复杂的依赖情况。与您不同,APT并不总是很聪明,无法知道这些添加和删除是否会造成严重破坏。

因此,如果您发现自己在“谨慎的解决方案”不起作用的地方,dist-upgrade可能会起作用...但是您最好还是多了解一些有关APT的知识并解决依赖性通过逐个安装和删除软件包来“手动”发行。

想起来就像修理汽车...如果您有时间并且可以用扳手方便地使用,通过阅读和自己进行维修,可以使您高枕无忧。如果您感到幸运,可以和表弟dist-upgrade一起下车,并希望她知道自己的知识。

评论


由于这是一个公认的答案,因此确实需要更新,以警告在稳定的系统上使用dist-upgrade,正如下面其他许多答案所指出的那样。我个人认为有一个更简单/更安全的答案需要推广:apt-get install

–Cas
2012年10月3日12:41



Cas,我是否应该补充一点,在稳定的系统上运行dist升级可能很危险?为什么那样危险呢? (老实说我不太了解。)

– Michael Crenshaw
2012年10月3日在16:27

有一个“服务器故障”答案可以更详细地说明dist-upgrade。我认为,有必要澄清一下(可能并不危险),它可能会升级整个系统,而这可能超出了用户的期望/要求,即在OP示例中,他们想知道为什么阻止了gimp。

–Cas
2012年10月5日在16:38



请注意,sudo apt-get dist-upgrade也可以删除软件包。因此,在运行sudo apt-get dist-upgrade时,最好始终先检查将要进行的更改列表。

– Eliah Kagan
13年3月22日在13:56

@EliahKagan我可以补充一点,即使apt-get升级也可以删除软件包?否则,如果存在版本冲突,它将始终这样做。考虑一下llvm3.6 vs. llvm3.6v5(“ v5”表示它是用gcc 5编译的)。这两个不能共存,只能将两者之一保留在系统上。因此,是的,dist-upgrade也可能会删除一些软件包,但不仅仅是dist-upgrade会这样做。在某些情况下,升级也会。

–syntaxerror
2015年10月12日15:58



#2 楼

每当您从命令apt-get upgrade收到消息

The following packages have been kept back:


,然后升级一个或所有保留的软件包,而无需进行发行版升级(这就是dist-upgrade的工作) ,如果我没记错的话)是发出以下命令:

apt-get install <list of packages kept back>


这将解决保留的问题,并要求安装其他软件包等,如前所述通过其他答案。

评论


当软件包以这种方式保留下来并且我手动apt-get upgrade <软件包列表>时,如果我重做apt-get upgrade,它将列出不再需要的有问题的软件包,并且我可以使用apt autoremove删除它们,我这样做,然后进行最后一次apt-get升级,它们不再列为保留状态...非常奇怪。有什么想法吗?

–cram2208
17年5月16日14:31



必要时apt-get install是否还会删除软件包以解决过时的依赖性情况,还是您必须运行单独的apt-get remove命令来完成升级过程的那一部分?

– Michael Crenshaw
17年5月5日在21:23

@ cram2208我相信这是预期的行为。 daccess-ods.un.org daccess-ods.un.org“自动安装且不再需要”的软件包是升级后的软件包的先前版本,现在不再需要。 apt autoremove然后删除这些未使用的依赖项。

– Alex
2017年9月7日下午0:56

如果升级需要安装新软件包,则该软件包将“保留”。首先考虑使用:sudo apt-get --with-new-pkgs升级,该升级不会引起将软件包标记为手动安装的副作用

–l –marc l
17年12月6日在21:59



@ mac9416是的。

– jarno
18年1月26日在18:04

#3 楼

尝试以下Unix SE答案:

sudo apt-get --with-new-pkgs upgrade



这将允许安装新软件包。它会告诉您将安装哪些软件包,并在实际执行安装之前提示您。


apt命令(是apt-get的友好替代品)共享此选项。

使用apt install <pkg>会将pkg标记为“手动安装”!要将其再次标记为“自动安装”,请使用apt-mark auto <pkg>(另请参见子命令showmanual)。有关此答案的更多信息。

评论


+1,因为它没有引起将软件包标记为手动安装的副作用。

–ctrl-alt-delor
17-10-7在11:05

请注意曾经读过我的评论的人:不会有标记为手动安装的副作用是一件好事。我喜欢这个答案。

–ctrl-alt-delor
18年5月2日在9:22



是。 apt-mark auto 仅在将软件包标记为自动安装时才需要(在手册页中)。

–巴勃罗·比安奇(Pablo Bianchi)
18年7月20日在4:37

出于某种原因,sudo apt-get --with-new-pkgs升级仍将软件包显示为“保留”。没有错误讯息。

–于富兰
18年11月12日在19:06

只是想补充一点,对于许多最新的debian 9.6服务器实例,这是绝对安全的解决方案。谢谢您,帕勃罗(Pablo),因为我很幸运地预先在登台环境中测试了其他选项,并且由于--with-new-pkgs包含在内,因此可以管理许多服务器达到安全标准,从而为将来的常规软件包管理提供了更为清晰的结果。确实,应该对UNIX SE答案进行投票!

–朱利叶斯
19年1月9日在8:18

#4 楼

apt-get dist-upgrade对于稳定的环境很危险,


错误的source.list设置会导致ubuntu损坏。
您可能会将整个应用程序升级到您不想要的版本。

用例:内核升级被保留,您只想升级内核,不想升级整个发行版。 >
处理保留的软件包的更好方法:

sudo aptitude


如果保留了软件包,则应该在列表顶部看到可升级软件包。 >

命中+在该列表上
命中两次g
如果被询问则回答debconf内容
按回车键继续
按Q
按是

您已安装了隐蔽软件包。

评论


仅当/etc/apt/sources.list*中的存储库不正确时,apt-get dist-upgrade才是危险的。很高兴知道dist-upgrade会升级所有软件包,但是使用默认存储库就可以了。不使用dist-upgrade可能很危险,因为您可能会错过安全更新。

– Flimm
2012年12月27日19:35

apt-get dist-upgrade可以删除也可以添加软件包,但这并不危险。如果您的sources.list文件有问题,任何软件包安装命令都可能导致严重损坏!常规的apt-get upgrade命令将从已启用的任何软件源安装任何软件包。 dist-upgrade并非以这种方式唯一。此外,在不修正bug 831768的版本中,至少在amd64上使用aptitude来执行任何操作比运行apt-get dist-upgrade危险得多。

– Eliah Kagan
13年3月22日在14:03

对我来说,(打开运行X的本地计算机)打开突触并强制进行软件包的升级比较容易。由于某种原因,它似乎根本不在您在突触中描述的地方出现。

– djvs
15年7月27日在14:39

也sudo aptitude安全升级

–麦桑福德
16年5月19日在15:31

@msanford谢谢!您的解决方案为我修复了sudo apt-get --with-new-pkgs升级没有的地方。

–约翰
3月26日9:36

#5 楼

通常,有两个原因可能会导致您看到此消息。

如果升级程序(通过q​​4312079q)将导致添加或删除软件包,则该程序将被保留。在这种情况下,您可以使用sudo apt-get upgrade,它将提供添加或删除其他程序的功能。

这很常见,通常不会出现问题。偶尔(尤其是在Ubuntu alpha中)sudo apt-get dist-upgrade会删除许多其他程序,在这种情况下,您可能想取消它。

如果程序依赖于不可用的软件包或版本, ,则该程序将被保留。在这种情况下,您实际上什么也不能做,只能等待,因为该软件包基本上是可卸载的。当程序包无序添加到存储库,重命名程序包或程序包停止提供虚拟程序包时,可能会发生这种情况。

评论


有没有一种方法可以确定所保存的软件包是否需要无法安装的依赖项,或者是否由于其他软件包所依赖而被保留。我有很多保留的软件包,我相信这两种情况都可能适用于我的系统。

–杰克
16 Dec 8'在9:29

谢谢,第二个原因是我的问题。甚至apt-get dist-upgrade也拒绝安装它。明智地检查该软件包表明它依赖于不可用的软件包。我想我得等。

– jlh
18年5月2日在14:55

#6 楼

您还可以尝试:

sudo aptitude safe-upgrade


它比full-upgrade(原名dist-upgrade)更安全,因为“除非未使用它们,否则它们不会被删除”。

man aptitude开始:


安全升级

将已安装的软件包升级到最新版本。除非未使用已安装的软件包
,否则它们不会被删除/.../当前未安装的软件包
可能会被安装来解决
依赖性,除非--no-new-installs命令-提供了行选项。


#7 楼

这些软件包很可能会被推迟,因为它们的安装会导致依赖性不一致。这可能是因为您在主动开发,ppas下使用归档文件,或者是因为您使用的镜像未完全更新。

在最后一种情况下,请等待,当依赖关系解决时,下次安装。

编辑:

还有另一种可能性,如果对它们进行固定或固定,则可能会将其保留。

评论


在不知道他进行过apt-get升级或apt-get dist-upgrade(替代能力)的情况下,这种可能性是基于什么呢?

– andol
2010年7月31日在22:21

这是支持问题和错误中最常出现的问题

–txwikinger
2010年7月31日在22:25

同意您可能应该等待并检查apt_preferences。这通常是由于开发档案库引起的,其中,可用软件包依赖关系变化非常快。等待它们稳定下来,您可能根本不需要进行远程升级。如果您仍要进行dist-upgrade,请在继续之前查看要安装的NEW软件包和要删除的软件包。

– Umang
2010年8月1日在2:29

这是我的情况,因为我使用dist-upgrade收到了“保留”消息

– Postadelmaga
2012年8月17日在9:02

如果此问题是由于apt偏好设置(固定)引起的,我发现重新安装保留的软件包对我有帮助:apt-get install --reinstall

– Tanius
14年4月13日在11:11

#8 楼

这对我有用

sudo aptitude full-upgrade


评论


甚至能力升级也对我有用。

– Bibhas
2013年12月14日下午16:15

我使用Ubuntu 14.04,但没有aptitude命令行

–艾哈迈德·哈米(ahmed hamdy)
2015年3月31日13:33



apt-get dist-upgrade也给了我同样的信息,但这为我解决了。我有一个正在中断另一个程序包升级的程序包。我不需要我安装的那个,因此aptitude完全升级让我可以选择删除它,以便它可以升级其他所有东西。

–f.ardelian
2015年4月30日,0:53

#9 楼

这通常是因为程序包已添加依赖项,并且升级不想在未经许可的情况下为您添加依赖项。

如果您运行:

sudo apt-get install gimp gimp-data libgegl-0.0-0 libgimp2.0


然后应将新版本及其新依赖项一起安装。

评论


升级特定程序包(及其依赖项),而无需进行dist-upgrade的承诺(风险)。

–John Mee
2015年9月21日在7:43

#10 楼

Ubuntu 18.04(及更高版本)通过apt full-upgrade提供了简化的语法,其功能类似于sudo apt-get --with-new-pkgs upgrade
 sudo apt full-upgrade
 


sudo apt upgrade被使用从通过sources.list(5)配置的源安装系统上当前安装的所有软件包的可用升级。如果需要满足依赖关系,将安装新的软件包,但是永远不会删除现有的软件包。如果软件包升级需要删除已安装的软件包,则不会执行此软件包的升级。
sudo apt full-upgrade执行升级功能,但是如果需要从当前安装的软件包进行整体升级,则将其删除。 。

请参阅:apt手册页:18.04、20.04

评论


此操作后,将释放2,548 MB磁盘空间。您将要做可能有害的事情。要继续输入短语“是,请按照我说的做!”

–科斯莫·阿伦
4月1日22:59

#11 楼

我发现如果版本略有不同,aptitude在升级软件包方面会做得更好。我遇到这样的情况:

me@compy:/etc/apt$ apt-cache policy gzip
gzip:
  Installed: 1.3.5-15
  Candidate: 1.3.5-15+etch1
  Version table:
     1.3.5-15+etch1 0
        500 http://archive.debian.org etch/main Packages
 *** 1.3.5-15 0
        100 /var/lib/dpkg/status


这使得apt-get阻止了更新,但是aptitude更新就很好了。我不确定使用哪种算法来确定是否应更新软件包。我猜这两个有相同的版本,只是一个不同的“限定词”。但是无论如何,apt-get不会更新它,但是能力会更新。

#12 楼

在我看来,与Linux标头和内核相关的软件包被保留下来。为此,我尝试解决在通知区域带有红色感叹号且无法更新软件包的问题。

要解决此问题,我既不必使用dist-upgrade也没有手动apt-get install xxx。

我所做的和提供的帮助很简单而且很干净:

sudo apt-get update
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get upgrade


我必须手动确认Grub更新及其配置。

然后我刚在计算机上工作了一段时间,然后再次出现了标准的更新对话框,包括带有内核及相关内容的“ Ubuntu base”部分。更新的执行没有任何麻烦,而且我再也看不到任何保留的软件包。

此外,请记住,包括内核更新在内的那些* buntu更新对休眠非常敏感-我已经遇到过几次这个问题,我总是可以通过重新启动机器并执行上述步骤来解决。

所以这也许就足够了!!

(此处描述的情况与我2015年12月下旬的Xubuntu 15.10有关)

#13 楼

当发布新内核时,我遇到了这个问题。 (可能是因为启用了不稳定的更新。)我发现最简单的安装方法是通过Ubuntu的图形安装程序(update-manager)。

#14 楼

这似乎是重新安装保留软件包的正确方法:

apt-get install --reinstall libjpeg-progs


从Ubuntu 14.04升级到16.04后libjpeg-progs卡住了,至少这对我有用。我确定您可以对其他任何保留的应用程序执行相同的操作,例如gimp

来源

评论


您也可以不使用--reinstall。

– jarno
18年1月26日在18:00

有趣的是,它删除了libjpeg-turbo-progs软件包。

– jarno
18年1月26日在20:11

#15 楼

我使用突触碰到了这个问题,因为它似乎挂起了,然后尝试重新启动并尝试解决此问题。
解决方案:然后,我发现软件包中提供了一些有用的信息,其中包含一些安装后说明对我来说。
我必须打“详细信息”,然后在读完消息后按“ q”退出,然后一切正常进行。

#16 楼

实际上,您需要的开关是dselect-upgrade,它可以安装/删除涉及的特定程序包集的依赖性。

#17 楼

我阅读了所有帖子,发现有很多有趣的解释。我正在尝试所有这些,但没有完全得到任何结果。
我无法升级无法使用的mysql-utilities。更新是由系统提出的。
因此,我想显示一些步骤。当然,我会在某些时候重复上述所有帖子。这是我的错误,是的,我是通过已经存在的帖子找到它的,但是下一步该怎么做?


下一步是:

sudo apt-get --purge remove mysql-utilities


结果可以在下面的图片中看到。我删除了软件包,并通过以下命令进行了检查:

sudo apt-get -f install


结果-很好!
后来我正确安装了此新版本的软件包。


这样,我想可以为更多的新人提供帮助,因为有了其他软件包,我们可以执行相同的步骤。

很抱歉,当我在某些地方重复时其他帖子。

评论


请不要在终端文本上使用屏幕截图,因为这会使Google无法搜索并且某些人无法阅读。而是将终端文本粘贴到您的答案中,选择该文本,然后在编辑器中按{}按钮以正确设置其格式。

–柴T.雷克斯
18年1月25日在22:14

@ ChaiT.Rex感谢您的发言,我将其视作未来。

– Vasyl Lyashkevych
18年1月25日在22:43

#18 楼

对于此问题的非常特殊的风味,其中专有的nvidia驱动程序已中途更新到新版本,我使用驱动程序管理器重新安装了它们。给出一些背景信息:我被困在440和450版本的驱动程序之间,并且保留了整个libnvidia 440软件包。这导致我的kubuntu在g虫之后卡在了垃圾屏幕上。要进入系统,我必须按如下所述在grub命令中添加“ nomodeset”。
在这种特定情况下,
sudo apt-get --with-new-pkgs upgrade

没有任何作用。但是,我能够通过其他驱动程序管理来重新安装驱动程序。就我而言,我在Kubuntu上启动了
sudo kubuntu-driver-manager

在Ubuntu上,您可以通过系统设置>系统>软件和更新>其他驱动程序来访问同一内容
,在那里我选择了450驱动程序和图形驱动程序已重新安装,从而可以正常启动计算机。

#19 楼

The following packages have been kept back:
  clang-9 cpp g++ gcc gcc-10-base kali-linux-default lib32gcc-s1 lib32stdc++6 libatomic1 libcc1-0
  libclang-common-9-dev libclang-cpp9 libgcc-s1 libgfortran5 libgomp1 libitm1 libllvm9 liblsan0 libobjc4
  libpython2-stdlib libquadmath0 libstdc++6 libtsan0 libubsan1 linux-headers-amd64 llvm-9 llvm-9-dev llvm-9-runtime
  llvm-9-tools python2 python2-minimal python3-chardet python3-pandas python3-pandas-lib

apt升级; apt更新只会不断返回到该状态,并且不会安装任何内容。也有很多东西需要自动删除,并且一切正常,但仍然不会安装保留的软件包。我在此线程的开头尝试了简单的选项1和2,但是它们没有用。
所以我只安装了/保留了软件包的整个列表/,然后一切就开始了。 br />我实际上从来没有遇到过这个问题。我只是觉得apt更新很奇怪。 apt升级没有用,但是apt安装然后将整个列表复制进去并顺利进行了。
我现在要道歉。我没有使用ubuntu发行版(我才意识到这一点)。当这一切发生时,我实际上是在更新Kali安装。我从来没有在Ubuntu上看到过类似的东西。
让我知道是否应该删除此帖子(还是新的)。
罗恩

#20 楼

对于我和Pablo回答的一些评论者而言,
sudo apt-get --with-new-pkgs upgrade  # No effect

没有任何效果。我不在乎将软件包标记为手动安装,因此我以保留软件包docker-ce为例进行了以下操作:
sudo apt install docker-ce  # Answer no, do not install

通过回答n中止安装。观察将要安装的新软件包,然后安装它们:
sudo apt install docker-ce-rootless-extras

现在apt upgrade将升级以前保留的软件包:
sudo apt upgrade  # Upgrades docker-ce