Debian 批量将软件包降级到当前可下载的版本

Debian 批量将软件包降级到当前可下载的版本

我有一堆由某些 Debian 存储库“增强”的软件包。现在我已经禁用了该存储库/etc/apt/sources.list.d,并且我想重新安装所有“增强”到......任何可用的软件包。我可以使用 grep 很好地获取软件包列表,但是

apt-get install --reinstall \
  $(dpkg-query -Wf '${Version}\t${Package}\n' | grep SOMEREPO | awk '{print $2}' )

报告无法下载这些软件包。当然他们不能——在他们当前的版本中不能。--reinstall --downgrade被拒绝apt。似乎降级的唯一方法是命名一个特定版本(这将需要更讨厌的脚本来编写包)。

有什么我忽略的吗?也许资质可以做到?

更新: 我知道可以通过固定(非常感谢,模组!),但实际上,这不是一个解决方案。很费力,而且我不在乎关于降级的具体来源。我想降级到当前启用的源中可用的任何版本。

更新2:我使用的是 Debian 衍生版本 (MX Linux),因此降级可能来自

  • Debian 破坏者
  • buster-backports
  • 发行版特定的https://mirrors.*/mx/MX-Packages/mx/repo/

答案1

Pin 优先级是解决方案;将其添加到/etc/apt/preferences或 下的新文件中/etc/apt/preferences.d

Package: *
Pin: release a=*
Pin-Priority: 1001

apt upgrade将安装它所知道的任何已安装软件包的最新版本,即使这意味着降级。apt之后只知道当前配置的存储库中的包,apt update因此这将达到预期的效果。

答案2

这就是我想出的:

apt install $(apt-show-versions | grep newer | awk '{print $1}' | while read pkg; do ver="$(apt-cache madison "$pkg" | head -n1 | awk -F'|' '{gsub("\\s", "", $2); print $2}')"; printf "%s=%s\n" "$pkg" "$ver"; done)

它的工作原理如下:

  1. 用于apt-show-versions | grep newer | awk '{print $1}'确定需要降级的软件包列表:

    host ~ # apt-show-versions|grep newer
    libapache2-mod-php:all 2:8.3+94+0~20240205.51+debian11~1.gbp6faa2e newer than version in archive
    libapache2-mod-php8.2:amd64 8.2.18-1+0~20240411.52+debian11~1.gbp91aa2d newer than version in archive
    [...]
    
  2. 使用apt-cache madison(这似乎是更容易解析的替代方案apt-cache policy)来确定每个包的最新版本:

    host ~ # apt-cache madison libapache2-mod-php    
    libapache2-mod-php | 2:8.2+93~iservbpo11+1 | https://update.iserv.eu/debian bullseye-stable/main amd64 Packages
    libapache2-mod-php |   2:7.4+76 | http://deb.debian.org/debian bullseye/main amd64 Packages
    
  3. pkg=ver为每个包构造一个字符串,libapache2-mod-php=2:8.2+93~iservbpo11+1即指示 APT 安装此特定版本的包,并将所有这些字符串传递给apt install.

答案3

为了将来参考,从按照你说的去做,Debian部门...经过一些激烈的脚本编写:

ps=$(for p in $(dpkg-query -Wf '${Version}\t${Package}\n' | grep REPO | awk '{print $2}'); do
  apt --quiet list $p | grep -v /now | grep / | awk '{print $1}' | head -1
done)
# this still leaves some /oldstable,oldstable broken versions
apt install --reinstall $(echo "$ps" | cut -f1 -d,)

并不是我推荐它;当系统妨碍简单任务时,这很烦人。

相关内容