如何忽略 rpm 安装中的冲突

问题描述 投票:0回答:4

我的文件夹中有一堆 rpm 文件。我正在尝试使用以下方式安装它们:

rpm -ivh *.rpm
所以 rpm 可以处理正确的安装顺序。

在其中一些 rpm 上,我的系统中安装了较新的版本,因此我得到了以下示例:

package info-5.0-1 (which is newer than info-4.13a-2) is already installed

/opt/freeware/man/man1/infokey.1 from install of info-4.13a-2 conflicts with file from package info-5.0-1

有没有办法忽略旧的 .rpm 文件并解决与已安装的新版本的依赖关系?我想到了 --force 选项。但是--force如何解决冲突呢?用旧版本覆盖它们还是忽略它们而留下新版本?

有任何想法欢迎提出。

linux unix rpm aix
4个回答
42
投票

--force
选项将重新安装已安装的软件包或覆盖其他软件包中已安装的文件。通常你不希望这样。

如果您告诉

rpm
从某个目录安装所有 RPM,那么它就会执行此操作。
rpm
不会忽略列出的安装 RPM。您必须手动从列表(或目录)中删除不需要的 RPM。无论您按什么顺序执行,它总是会用“安装的最新 RPM”覆盖文件。

您可以删除旧的 RPM,

rpm
将解决与已安装 RPM 的较新版本的依赖关系。但这仅在要安装的 RPM 都不完全依赖于旧版本的情况下才有效。

如果您确实需要同一 RPM 的不同版本,则 RPM 必须是 可重定位。然后,您可以告诉

rpm
将特定 RPM 安装到其他目录。如果文件不冲突,那么您可以使用
rpm -i
安装不同版本(
zypper in
不能安装同一 RPM 的不同版本)。例如,我在工作中将红宝石宝石打包为可重定位的 RPM。所以我可以安装同一个 gem 的不同版本。

我不知道您的 RPM 在哪些文件上存在冲突,但如果所有这些文件“只是”手册页,那么您可能只需使用

rpm -i --replacefiles
用旧文件覆盖新文件即可。唯一的问题是,它可能会让正在阅读旧手册页并认为这是实际版本的人感到困惑。另一个问题是
rpm --verify
命令。如果旧包覆盖了一些文件,它会抱怨新包。

这可能是 https://serverfault.com/questions/522525/rpm-ignore-conflicts 的重复吗?


15
投票

从上下文来看,冲突是由于包的版本引起的。
我们来看看关于

rpm
的手册:

--force
    Same as using --replacepkgs, --replacefiles, and --oldpackage.

--oldpackage
    Allow an upgrade to replace a newer package with an older one.

因此,您可以执行命令

rpm -Uvh info-4.13a-2.rpm --force
来解决您的问题。


12
投票

尝试刷新命令:

rpm -Fvh *.rpm

0
投票

我使用下一个代码在目录中安装最新版本的冲突包:

cd $packages_dir

function mline {
    # converts string with spaces to multiline string
    echo "$@" | tr ' ' '\n'
}

all_p=$(ls -1)

uniqs=$(mline $all_p | grep -o -P '^.*?-[0-9]' | awk '{print substr($1, 1, length($1)-2)}' | uniq)

to_install=""
for p in $uniqs
do  
    echo "package: $p"
    p_regex=$(echo $p | tr '+' '\+' | tr '.' '\.')

    candidates=$(mline $all_p | grep -P "^$p_regex?-[0-9]" | sort)
    count=$(mline $candidates | wc -l)

    if [ "$count" != "1" ]
    then
        echo -e "\tcandidates ($count):"
        echo -e "\t\t$(echo $candidates | sed 's/ /\n\t\t/g')"
        last=$(mline $candidates | tail -1)
    else
        last=$candidates
    fi
    echo -e "\tchosen: $last"

    to_install+="$last "

done

dnf -y install $to_install

备注:

  • 我只是列出整个目录并选择没有版本的唯一包名称,
    ?-[0-9]
    意味着找到第一个版本字符并停止
  • 之后,我选择冲突的最新版本(最后一个字符串)
© www.soinside.com 2019 - 2024. All rights reserved.