是否可以仅允许PPA中的特定包更新

让我们说我添加了一个具有我想要的X包的PPA,但它也有我不想使用或接收更新的Y包。 我如何从同一PPA接收特定包的更新,但拒绝来自其他包的相同PPA的更新。

一步一步的例子会很好,因为我在几个拥有特定软件包的PPA中发生了这种情况,但也添加了一大堆我还不想更新的软件包。

你会使用所谓的“钉扎”

假设您正在从PPA安装包foo,您几乎肯定需要安装ppa中的任何依赖项。

但是,如果有其他程序,您可以指定要与固定使用的存储库。

请参阅Ubuntu wiki固定

在该页面上有一个固定ppa的例子

https://help.ubuntu.com/community/PinningHowto#Pinning_the_ubuntu-mozilla-daily_PPA

来自维基页面:

为了尽可能轻松地进行apt-get升级,在PPA上设置较低的Pin-Priority,这将阻止不需要的软件包版本的安装。 一旦设置,来自ubuntu-mozilla-daily PPA的软件包在与其他软件包的任何竞争中总是会丢失,即使它们具有更高版本。

创建文件/etc/apt/preferences.d/ubuntu-mozilla-daily-pin-400

将以下内容添加到文件中:

 Package: * Pin: release o=LP-PPA-ubuntu-mozilla-daily Pin-Priority: 400 

使用以下命令检查Pin优先级是否已更新。

 apt-cache policy apt-cache policy firefox-3.5 

首先,如果您已经错误地从PPA升级了软件包,请参阅以下答案: https : //askubuntu.com/a/142808/103117 ,特别是有关使用ppa-purge的部分。 因为我已经升级了包并且apt-get不会降级而不管优先级如何,最简单的方法是首先清除所有升级的包,然后修复优先级,然后重新添加PPA并仅升级所需的包。

有关优先级/固定系统的完整说明,请参阅man apt_preferences

如果某个程序包可从多个源获得,则每个程序包都将分配一个优先级,您可以通过apt-cache policy 查看该apt-cache policy 。 例如,我使用名为nathan-renniewaldock / ppa / ubuntu的PPA,我不想从那里安装mysql-server-5.5(我的“包Y”)。 所以我可以通过以下方式查看我的现状:

 rob@frodo:~$ apt-cache policy mysql-server-5.5 mysql-server-5.5: Installed: 5.5.27-1~ppa1~precise Candidate: 5.5.27-1~ppa1~precise Version table: *** 5.5.27-1~ppa1~precise 0 500 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages 100 /var/lib/dpkg/status 5.5.24-0ubuntu0.12.04.1 0 500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages 5.5.22-0ubuntu1 0 500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages 

因此,因为一切都是优先级500,所以根据手册页选择具有最高版本号的那个。

例如,如果您只想安装ddclient(“package X”)而不安装任何其他软件包,那么除了ddclient之外,您希望降低PPA中所有软件包的优先级。 创建一个名为/etc/apt/preferences.d/nathan-preferences 。 请注意,该目录中的所有文件都被读取,并且有一些关于文件名的规则(它必须只包含字母数字字符,超文本,短划线并且没有扩展名或以.pref结尾)。

首先,我们需要知道如何识别我们的PPA。 apt-cache policy命令自己发出有关所有源的信息。 我知道我的PPA名字中有“nathan”所以我这样做:

 $ apt-cache policy | grep nathan 400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main i386 Packages release v=12.04,o=LP-PPA-nathan-renniewaldock,a=precise,n=precise,l=PPA,c=main 

有趣的部分是“o = LP-PPA-nathan-renniewaldock”,我们在/etc/apt/preferences.d/nathan-prefs文件中使用它,如下所示:

 Package: * Pin: release o=LP-PPA-nathan-renniewaldock Pin-Priority: 400 Package: ddclient Pin: release o=LP-PPA-nathan-renniewaldock Pin-Priority: 500 

这会将PPA中的所有内容设置为优先级400,然后将ddclient恢复为默认值500.现在,我可以检查它是否有效:

 $ apt-cache policy ddclient ddclient: Installed: 3.8.0-11.4ubuntu1 Candidate: 3.8.1-0~ppa1~precise Package pin: 3.8.1-0~ppa1~precise Version table: 3.8.1-0~ppa1~precise 500 400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages *** 3.8.0-11.4ubuntu1 500 500 http://gb.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages 100 /var/lib/dpkg/status 

因此ddclient的优先级为500,与原始的Ubuntu包相同,但它将从nathan PPA安装,因为它是更高版本。 现在让我们确保不会安装其他软件包:

 $ apt-cache policy mysql-server mysql-server: Installed: 5.5.24-0ubuntu0.12.04.1 Candidate: 5.5.24-0ubuntu0.12.04.1 Version table: 5.5.27-1~ppa1~precise 0 400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages *** 5.5.24-0ubuntu0.12.04.1 0 500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages 100 /var/lib/dpkg/status 5.5.22-0ubuntu1 0 500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages 

在这种情况下,nathan PPA的包具有优先级400,低于Ubuntu,因此即使它是更高版本,它也不会升级。 我们可以查询:

 $ sudo apt-get upgrade Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: ddclient 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 77.7 kB of archives. After this operation, 11.3 kB of additional disk space will be used. Do you want to continue [Y/n]? 

由于只有我想要的包装升级,我很乐意说是。