我跑了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
太长了;
- 获取有问题的文件列表(将 pacman 的输出复制并粘贴到文件中)。
- 使用awk将除文件路径之外的所有内容删除到新列表中。
- 使用尽管根据列表将有问题的文件移开。
- 再次运行
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