是否可以只允许来自 PPA 的特定软件包更新

Lui*_*ado 19 ppa

假设我添加了一个 PPA,它有我想要的 X 包,但它也有我不想使用或接收更新的 Y 包。我怎样才能从同一个 PPA 接收特定包的更新,但拒绝来自同一个 PPA 的其他包的更新。

一个循序渐进的例子会很好,因为这发生在我身上的几个 PPA 中,这些 PPA 有一个我想要的特定包,但也添加了一大堆我还不想更新的其他包。

Pan*_*her 17

您将使用所谓的“固定”

假设您正在从 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
Run Code Online (Sandbox Code Playgroud)

在之前和之后使用以下命令检查 Pin-Priority 是否已更新。

apt-cache policy

apt-cache policy firefox-3.5
Run Code Online (Sandbox Code Playgroud)


Rob*_*her 9

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

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

如果一个包可从多个来源获得,则每个来源都将被分配一个优先级,您可以使用apt-cache policy <package name>. 例如,我使用名为 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
Run Code Online (Sandbox Code Playgroud)

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

例如,如果您只想安装 ddclient(“包 X”),而不安装任何其他包,则您希望降低 PPA 中除 ddclient 之外的所有包的优先级。创建一个名为/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
Run Code Online (Sandbox Code Playgroud)

有趣的部分是“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
Run Code Online (Sandbox Code Playgroud)

这将 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
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,来自 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]?
Run Code Online (Sandbox Code Playgroud)

既然只升级我想要的包,我很乐意答应。