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

mod*_*tos 59 arch-linux 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 52

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

重现--force盲目覆盖任何冲突的选项的命令是这样的:

sudo pacman -S --overwrite \* <package_name>
Run Code Online (Sandbox Code Playgroud)

或者

sudo pacman -S --overwrite "*" <package_name>
Run Code Online (Sandbox Code Playgroud)

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


mod*_*tos 33

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

现在我的pacman -Syu解决得很好。

  • --force 已弃用;改用 --overwrite 。 (14认同)
  • --force 对我有用,但 --overwrite 不是 (7认同)
  • `sudo pacman -Syu --force` 对我有用,但无法识别覆盖。 (3认同)

l0b*_*0b0 23

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

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

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

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

  • 请参阅上面我对@umlaute 的评论。我认为冲突来自“sudo pip install”命令。也许我应该避免将 pip 与 sudo 一起使用? (2认同)

hLk*_*hLk 16

升级并覆盖冲突包的正确方法是:

sudo pacman --overwrite "*" -Syu
Run Code Online (Sandbox Code Playgroud)


Fin*_*off 6

太长了;

  1. 获取有问题的文件列表(将 pacman 的输出复制并粘贴到文件中)。
  2. 使用awk将除文件路径之外的所有内容删除到新列表中。
  3. 根据列表,使用while将有问题的文件移开。
  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
Run Code Online (Sandbox Code Playgroud)

...还有更多。

  • 复制终端的输出,并将其放入文件中。我使用nano,并将我的命名为“文件”,如~/work/files

  • 去除无关信息:

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

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

处理文件

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

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

  • 如果您确实想删除它们,则没有理由这样做(危险危险):while read -r file; 执行 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