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


38

我跑了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将不允许使用文件覆盖目录或安装具有冲突文件和目录的软件包。

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


5
为什么首先要有冲突的文件?使用的软件包管理器时,不要尝试在它的脚趾抽头(例如,通过在地方包管理器理所当然地认为安装软件是他们的;如果你必须手动安装的东西,安装到/usr/local/而非/usr/
umläute

1
@umläute我不确定冲突文件的来源,但我怀疑它们与我在此页面上安装的docker-compose的安装sudo pip install -U docker-compose==1.5.0rc3 有关。也许sudo pip install与吃豆人冲突?
modulitos 2015年

2
@umläute获取错误的-S更新(部分安装等)将使您遇到这种情况。我的情况--force一直在起作用。
erm3nda

Answers:


28

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

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


6
-不推荐使用力;使用--overwrite代替。
Ankit Balyan

6
--force对我有用,但--overwrite无效
Infernion

2
sudo pacman -Syu --force为我工作,但覆盖不被认可。
spydon '18

21

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

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

./configure && make && sudo make install可以使用卸载许多使用标准模式安装的应用程序sudo make uninstall。如果您已经以其他方式安装了该应用程序,则可能需要其他一些方式才能将其卸载。通常,将安装文件的副本保留在某个位置(例如~/install)是一个好主意,以便在这种情况下能够可靠地卸载它们。仅删除有冲突的文件可能会留下其他文件,这很可能会引起其他问题。

与其他程序包管理器一起安装软件时,可以通过多种方法将其与系统文件隔离。例如,在软件开发过程中,这是一种既定的最佳实践,在该过程中,您确实要保持版本一致并避免与其他软件发生冲突。示例包括:


2
请参阅上面我对@umlaute的评论。我认为冲突来自sudo pip install命令。也许我应该避免在sudo中使用pip?
modulitos 2015年


2

TLDR;

  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

...还有更多。

  • 复制终端的输出,并将其放入文件中。我使用了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

  • 如果您确实要删除它们,则没有理由这样做(DANGER DANGER):在读取-r文件时;做sudo rm-“ $ file”; 完成<files2

更新中

  • 为了使--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



0

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

一个等效的重现--force选项的命令将盲目地覆盖任何冲突的内容,将是:

sudo pacman -S --overwrite \*

要么

sudo pacman -S --overwrite "*"

棘手的部分是逃避glob,以避免shell首先扩展它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.