问题描述
我刚刚为GIMP的开发版本添加了PPA存储库,但出现此错误:
$ apt-get update && apt-get upgrade
...
The following packages have been kept back:
gimp gimp-data libgegl-0.0-0 libgimp2.0
为什么以及如何解决这个问题,以便我可以使用最新版本而不是现在使用的版本?
最佳解决方案
根据an article on debian-administration.org,
If the dependencies have changed on one of the packages you have installed so that a new package must be installed to perform the upgrade then that will be listed as “kept-back”.
谨慎的解决方案:
谨慎的解决方案是运行sudo apt-get install <list of packages kept back>
。在大多数情况下,这将为kept-back软件包提供成功升级所需的功能。
积极的解决方案:
更积极的解决方案是运行sudo apt-get dist-upgrade
,这将强制安装这些新的依赖项。
但dist-upgrade
可能相当危险。 为什么使用apt-get升级代替apt-get dist-upgrade?它可能会删除软件包来解决复杂的依赖情况。与你不同,APT并不总是足够聪明,无法知道这些添加和删除是否会造成严重破坏。
因此,如果您发现自己处于”cautious solution”无法工作的地方,dist-upgrade
可能会工作……但您可能更适合了解更多有关APT的内容,并通过在case-by-case基础上安装和删除软件包来解决依赖关系问题”by hand” 。
想想它就像修理一辆汽车……如果你有时间并且用扳手很方便,你可以通过阅读和自己修理来获得一些安心。如果你感觉幸运,可以和你的表弟dist-upgrade
一起停车,希望她知道她的东西。
次佳解决方案
每当你从命令apt-get upgrade
收到消息
The following packages have been kept back:
然后升级一个或全部kept-back软件包,而不进行分发升级(如果我没有记错的话,这就是dist-upgrade
所做的)是发出命令:
apt-get install <list of packages kept back>
这将解决kept-back问题,并要求安装其他软件包等,正如其他答案所解释的那样。
第三种解决方案
apt-get dist-upgrade
对于稳定的环境是危险的,
-
错误的source.list设置,你最终破坏Ubuntu的。
-
您可能会将整个应用程序升级到您不想要的版本。
用例:内核升级后退,你只是想升级内核,不想升级整个发行版。
更好的方式来处理后备包裹:
sudo aptitude
如果您保留了软件包,您应该在列表顶部看到可升级软件包。
-
点击该列表中的+
-
打g两次
-
如果询问,请回答debconf的东西
-
按返回继续
-
按Q键
-
按是
您的后备包已安装。
第四种方案
通常有两个原因可能会看到此消息。
如果升级程序(通过sudo apt-get upgrade
)会导致软件包被添加或删除,那么程序将被阻止。在这种情况下,您可以使用sudo apt-get dist-upgrade
,然后可以添加或删除其他程序。
这很常见,通常不是问题。偶尔(特别是在Ubuntu alpha版本中)dist-upgrade
将提供删除很多其他程序,在这种情况下,您可能想要取消它。
如果程序依赖于不可用的程序包或版本,那么程序将被阻止。在这种情况下,你真的不能做任何事情,因为这个软件包基本上是可以卸载的。当程序包无序添加到存储库,重命名程序包或程序包停止提供虚拟程序包时,会发生这种情况。
第五种方案
为什么你不试试this Unix SE answer:
sudo apt-get --with-new-pkgs upgrade
This allows new packages to be installed. It will let you know what packages would be installed and prompt you before actually doing the install.
apt
命令共享此apt-get
选项。
第六种方案
这些软件包很可能会被阻止,因为它们的安装会造成依赖性不一致。这可能发生是因为您正在使用活动开发中的档案,ppas,或者因为您使用的镜像没有完全更新。
在最后一种情况下,等待,依赖关系解决后,它将在下次安装。
编辑:
还有另一种可能性,如果包裹被阻塞或者被固定,包裹可能会被阻止。
第七种方案
你也可以尝试:
sudo aptitude safe-upgrade
。
它比full-upgrade
(最初名为dist-upgrade)更安全,因为“软件包不会被删除,除非它们未被使用”。
来自man aptitude
:
safe-upgrade
Upgrades installed packages to their most recent version. Installed packages will not be removed unless they are unused /…/ Packages which are not currently installed may be installed to resolve dependencies unless the –no-new-installs command-line option is supplied.
第八种方案
这通常是因为软件包添加了依赖项,并且升级不希望在未经许可的情况下为您添加它。
如果你运行:
sudo apt-get install gimp gimp-data libgegl-0.0-0 libgimp2.0
然后,新版本应与其新的依赖关系一起安装。
第九种方案
这对我有效
sudo aptitude full-upgrade
第十种方案
我发现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更新它就好了。我不确定使用哪种算法来确定程序包是否应该更新。我猜这两个版本是相同的,只是不同的’qualifier’。但无论如何,apt-get不会更新它,但aptitude会。
参考资料