web-dev-qa-db-fra.com

erreur pacman "existe sur le système de fichiers"

L'Iran Sudo pacman -Syu et j'ai eu quelques erreurs de lecture intéressantes:

erreur: échec de validation de la transaction (fichiers en conflit)

et une longue liste de fichiers suivie de exists in filesystem. La sortie complète est ici: http://ix.io/lLw

Il semble que beaucoup de ces fichiers ne soient pas associés à un package lorsque je les ai vérifiés avec pacman -Qo <path-to-file>, mais je ne les ai pas tous vérifiés. J'avais une connexion faible lorsque j'ai couru pacman -Syu, mais j'obtiens les mêmes erreurs lors de la mise à jour ultérieure: http://ix.io/lLx

Que devrais-je faire? Dois-je vérifier tous les fichiers et supprimer ceux qui n'ont pas de package associé? Dois-je forcer la mise à jour (avec Sudo pacman -S --force <package-name>?)

Mise à jour

J'ai essayé d'exécuter Sudo pacman -S --force <package-name> et j'ai obtenu ceci:

[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

On dirait pacman -S --force <package n'écrase pas les répertoires contenant des fichiers. De l'homme:

L'utilisation de --force ne permettra pas d'écraser un répertoire avec un fichier ou d'installer des packages avec des fichiers et des répertoires en conflit.

Dois-je simplement supprimer les répertoires en conflit? (ils n'ont pas de packages associés)

40
modulitos

Ok, ça ressemble à courir Sudo pacman -S --force <package-name> fonctionne, mais il ne résout pas les répertoires en conflit. Dans de tels cas, l'exécution de Sudo rm -rf sur les répertoires en conflit, suivi de Sudo pacman -S --force <package-name> travaux.

Maintenant mon pacman -Syu se résout bien.

30
modulitos

tl; dr: désinstallez l'application en conflit avant d'exécuter pacman.

pacman (et les autres gestionnaires de packages) conservent un index des packages et fichiers qu'ils gèrent (pacman --query --list). Certains fichiers, tels que la configuration, seront marqués comme modifiables et ne seront pas écrasés lors de la mise à niveau (sauf dans des circonstances spéciales, où le gestionnaire de packages supprimera généralement l'ancien fichier avant d'en créer un nouveau). Les autres fichiers seront marqués comme non modifiables. Si une autre application modifie ces fichiers de quelque manière que ce soit sans mettre à jour l'index en conséquence, le gestionnaire de packages n'a aucun moyen de savoir quoi faire de ces fichiers pendant une mise à niveau.

De nombreuses applications installées à l'aide de la norme ./configure && make && Sudo make install le modèle peut être désinstallé à l'aide de Sudo make uninstall. Si vous avez installé l'application d'une autre manière, vous devrez peut-être autre chose pour la désinstaller. En général, il peut être judicieux de conserver une copie des fichiers d'installation quelque part (par exemple ~/install) pour pouvoir les désinstaller de manière fiable dans de tels cas. La simple suppression des fichiers en conflit laissera probablement d'autres fichiers traîner, ce qui pourrait éventuellement causer d'autres problèmes.

Lors de l'installation de logiciels avec d'autres gestionnaires de packages, il existe des moyens d'isoler ceux-ci des fichiers système. C'est une bonne pratique établie par exemple lors du développement de logiciels, où vous voulez vraiment garder les versions cohérentes et éviter les conflits avec d'autres logiciels. Les exemples comprennent:

21
l0b0

Après pacman finalement déprécié --force option et pour rendre le substitut --overwrite l'option fonctionne comme prévu, le modèle d'utilisation suivant doit être noté.

Une commande équivalente pour reproduire --force option qui écrase aveuglément tout ce qui sera en conflit:

Sudo pacman -S --overwrite \*

Ou

Sudo pacman -S --overwrite "*"

La partie délicate est d'échapper au glob pour éviter que Shell ne le développe en premier.

12
nix

J'installais des paquets que j'installe habituellement avec pip via pacman à cause de cela. Mais certains paquets ne se trouvent pas dans les dépôts pacman. Je pense que nous devrions éviter d'installer pip avec les privilèges Sudo et istead:

pip install pillow --user

- L'indicateur utilisateur crée à la place des packages d'installation pip dans votre répertoire personnel, ce qui ne nécessite aucun privilège spécial . https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install -user

3
lava-lava

TLDR;

  1. Obtenez une liste des fichiers incriminés (copiez et collez la sortie de pacman dans un fichier).
  2. Utilisez awk pour supprimer tout sauf les chemins de fichier dans une nouvelle liste.
  3. Utilisez while pour déplacer les fichiers incriminés, en fonction de la liste.
  4. Courir Sudo pacman -Syu encore.

    modifié pour ajouter TLDR et corriger les fautes de frappe

Bien que je sois à peu près sûr que je n'ai rien fait de stupide, j'ai eu ce problème peut-être toutes les deux fois que j'ai essayé de mettre à jour depuis que j'utilise Manjaro; trois ou quatre fois en deux mois. Le point étant, cela le corrige.

Obtenez une liste de vos fichiers.

Lorsque la mise à jour échoue dans votre fenêtre de terminal, vous obtenez ceci:

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

... et beaucoup plus.

  • Copiez la sortie du terminal et placez-la dans un fichier. J'ai utilisé nano , et j'ai nommé les "fichiers", comme dans ~/work/files .

  • Dépouiller les informations étrangères:

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

    Cela prend le deuxième "Word" de chaque ligne et l'imprime dans les fichiers2.

Traitez les fichiers

  • Vous pouvez les supprimer, les déplacer ou les renommer.

  • Si quelque chose se casse, il est plus facile de le réparer si nous le cassons en le déplaçant au lieu de le supprimer ou de le renommer:
    mkdir ~/work/oldfiles while read -r file; do Sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Si vous voulez vraiment les supprimer, ce qu'il n'y a aucune raison de faire (DANGER DANGER): pendant la lecture du fichier -r; do Sudo rm - "$ file"; fait <fichiers2

Mise à jour

  • Pour que --overwrite fonctionne, ce que nous devons faire pour que pacman réalise que le paquet n'est pas cassé, vous avez besoin de la syntaxe suivante:

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

    • Dans mon cas: Sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • En suivant l'exemple: Sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • J'ai eu un problème mignon où si je supprimais le lien symbolique libidn2.so.0, rien ne fonctionnait et quand je le remettais, j'obtenais l'erreur "existe sur le système de fichiers". Ce qui précède, avec - overwrite, est tout ce qui a fonctionné pour moi.

  • Finalement:

    Sudo pacman -Syu

2
Fin Hirschoff

Si vous avez beaucoup de fichiers comme moi,

Sudo pacman --force -Syyu  

résout tous les problèmes.

0