pacman“文件系统上存在”错误

pacman“文件系统上存在”错误

我跑了sudo pacman -Syu之后发现了一些有趣的错误:

错误:无法提交事务(文件冲突)

以及一长串文件,后跟exists in filesystem.完整输出在这里:http://ix.io/lLw

当我使用 检查这些文件时,其中许多文件似乎与包没有关联pacman -Qo <path-to-file>,但我没有全部检查它们。当我运行时,我的连接很弱pacman -Syu,但是当我稍后更新时,我得到了同样的错误:http://ix.io/lLx

我应该怎么办?我应该检查所有文件并删除没有关联包的文件吗?我应该强制更新(用sudo pacman -S --force <package-name>?)

更新

我尝试运行sudo pacman -S --force <package-name>并得到了这个:

[my-pc]/home/average-joe$ pacman -Qo /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info
error: No package owns /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info

看起来pacman -S --force <package不会覆盖包含文件的目录。来自男人:

使用 --force 将不允许使用文件覆盖目录或安装具有冲突文件和目录的软件包。

我应该删除冲突的目录吗? (他们没有关联的包)

答案1

在 pacman 最终弃用该--force选项并使代理--overwrite选项按预期工作后,应注意以下使用模式。

重现盲目覆盖任何冲突的选项的命令--force如下:

sudo pacman -S --overwrite \* <package_name>

或者

sudo pacman -S --overwrite "*" <package_name>

棘手的部分是转义通配符以阻止 shell 首先扩展它。

答案2

好的,看起来运行sudo pacman -S --force <package-name>正常,但它不能解决冲突的目录。在这种情况下,sudo rm -rf在冲突的目录上运行,然后就sudo pacman -S --force <package-name>可以了。

现在我的pacman -Syu决心很好。

答案3

tl;dr:在运行之前卸载冲突的应用程序pacman

pacman(和其他包管理器)保留包和文件的索引他们管理的(pacman --query --list)。某些文件(例如配置)将被标记为可修改,并且在升级过程中不会被覆盖(除非在特殊情况下,包管理器通常会在创建新文件之前移走旧文件)。其他文件将被标记为不可修改。如果另一个应用程序以任何方式更改这些文件而不相应地更新索引,则包管理器无法知道在升级期间如何处理这些文件。

许多使用标准./configure && make && sudo make install模式安装的应用程序可以使用以下命令卸载sudo make uninstall。如果您以其他方式安装了该应用程序,则可能需要通过其他方式来卸载它。一般来说,这是一个好主意保留安装文件的副本在某些地方(例如~/install)能够在这种情况下可靠地卸载它们。仅删除冲突的文件可能会留下其他文件,这可能会导致其他问题。

当使用其他包管理器安装软件时,有一些方法可以将它们与系统文件隔离。这是一种既定的最佳实践,例如在软件开发过程中,您确实希望保持版本一致并避免与其他软件发生冲突。示例包括:

答案4

太长了;

  1. 获取有问题的文件列表(将 pacman 的输出复制并粘贴到文件中)。
  2. 使用awk将除文件路径之外的所有内容删除到新列表中。
  3. 使用尽管根据列表将有问题的文件移开。
  4. 再次运行sudo pacman -Syu

    编辑以添加 TLDR 并修复拼写错误

虽然我很确定我没有做任何愚蠢的事情,但自从我使用 Manjaro 以来,我可能每次尝试更新时都会遇到这个问题;两个月内三四次。重点是,这解决了它。

获取您的文件列表。

当终端窗口中的更新失败时,您会看到以下信息:

error: failed to commit transaction (conflicting files)
evilfile: /usr/bin/evilfile exists in filesystem
libx000: /usr/lib/libx000.so.f.u.loser exists in filesystem
accountsservice: /usr/share/locale/ru/LC_MESSAGES/accounts-service.mo.yu.dnt.evn.spk.russian exists in filesystem

...还有更多。

  • 复制终端的输出,并将其放入文件中。我用了纳米,并将我的命名为“文件”,如〜/工作/文件

  • 去除无关信息:

    cat files | awk '{print $2}' >> ~/work/files2

    这将从每行中取出第二个“单词”并将其打印到 files2 中。

处理文件

  • 您可以删除它们、移动它们或重命名它们。

  • 如果出现问题,最容易修复的方法是移动它而不是删除或重命名它:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • 如果您确实想删除它们,则没有理由这样做(危险 危险):当读取-r文件时;执行 sudo rm --“$file”;完成 < 文件2

更新中

  • 为了让 --overwrite 工作(我们需要让 pacman 意识到包没有损坏),您需要以下语法:

    sudo pacman -S package_name --overwrite /location/of/thing

    • 就我而言:sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • 下面的例子:sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • 我遇到了一个可爱的问题,如果我删除了 libidn2.so.0 符号链接,则没有任何效果,当我将其放回去时,我收到“文件系统上存在”错误。上面的 --overwrite 是对我有用的。

  • 最后:

    sudo pacman -Syu

相关内容