我有一堆由某些 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)
它的工作原理如下:
用于
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 [...]
使用
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
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,)
并不是我推荐它;当系统妨碍简单任务时,这很烦人。