erreur pacman «existe sur le système de fichiers»


38

J'ai couru sudo pacman -Syuet j'ai eu quelques erreurs intéressantes en lisant:

erreur: échec de la 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 sont pas associés à un package lorsque je les ai vérifiés pacman -Qo <path-to-file>, mais je ne les ai pas tous vérifiés. J'avais une connexion faible lors de l'exécution pacman -Syu, mais je reçois 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 paquet associé? Dois-je forcer la mise à jour (avec sudo pacman -S --force <package-name>?)

Mise à jour

J'ai essayé de courir sudo pacman -S --force <package-name>et j'ai eu 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

Il semble que pacman -S --force <packagene remplace pas les répertoires contenant des fichiers. De l'homme:

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

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


5
pourquoi avez-vous des fichiers en conflit en premier lieu? lorsque vous utilisez un gestionnaire de paquets, essayez de ne pas taper sur ses doigts (par exemple, en installant des logiciels dans des endroits que le gestionnaire de paquets pense légitimement; si vous devez installer les choses manuellement, installez /usr/local/plutôt /usr/)
umläute

1
@ umläute Je ne sais pas exactement d'où proviennent les fichiers en conflit, mais je suppose qu'ils sont liés à mon installation de docker-compose que j'ai installée à l'aide sudo pip install -U docker-compose==1.5.0rc3 de cette page . Peut-être des sudo pip installconflits avec pacman?
Modulitos

2
@ umläute Obtenir de mauvaises -Smises à jour (installations partielles, etc.) vous permettra de réaliser ce scénario. Cas de moi a --forcetravaillé tout le temps.
m3nda

Réponses:


28

Ok, cela semble fonctionner sudo pacman -S --force <package-name>, mais cela ne résout pas les répertoires en conflit. Dans de tels cas, en cours sudo rm -rfd' exécution sur les répertoires en conflit, suivi de sudo pacman -S --force <package-name>travaux.

Maintenant ma pacman -Syurésolution se résout bien.


6
--force est obsolète; utilisez --overwrite à la place.
Ankit Balyan

7
--force travaille pour moi mais - overwrite n'est pas
Infernion

3
sudo pacman -Syu --forcetravaillé pour moi, mais écraser n'a pas été reconnu.
Spydon

21

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

pacman(et d’autres gestionnaires de paquets) gardent un index des paquets et des fichiers qu’ils gèrent ( pacman --query --list). Certains fichiers, tels que la configuration, seront marqués comme étant modifiables et ne seront pas écrasés lors de la mise à niveau (sauf dans des circonstances spéciales, où le gestionnaire de packages écartera généralement l'ancien fichier avant de créer le 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, le gestionnaire de packages n'a aucun moyen de savoir quoi faire avec ces fichiers lors d'une mise à niveau.

De nombreuses applications installées à l'aide du ./configure && make && sudo make installmodèle standard peuvent être désinstallées à 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. Le simple fait de supprimer les 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 paquets, il existe des moyens d'isoler ceux-ci des fichiers système. Il s'agit d'une meilleure pratique établie, par exemple lors du développement de logiciels, dans lequel vous souhaitez réellement conserver la cohérence des versions et éviter les conflits avec d'autres logiciels. Les exemples comprennent:


2
Voir mon commentaire à @umlaute ci-dessus. Je pense que le conflit venait d'une sudo pip installcommande. Peut-être devrais-je éviter d'utiliser pip avec sudo?
Modulitos

3

J'installais des paquets que j'installe habituellement avec pip via pacman à cause de cela. Mais certains paquets ne sont pas trouvés dans pacman repos. Je pense que nous devrions éviter d'installer pip avec les privilèges sudo et istead:

pip install pillow --user

L'option --user permet à pip d'installer des paquetages 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


2

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 le contenu sauf les chemins de fichiers dans une nouvelle liste.
  3. Utilisez while pour déplacer les fichiers incriminés en fonction de la liste.
  4. Courir à sudo pacman -Syunouveau.

    édité pour ajouter TLDR et corriger les fautes de frappe

Bien que je sois à peu près sûr de n'avoir rien fait de stupide, j'ai ce problème à chaque fois que j'essaye de mettre à jour depuis que j'utilise Manjaro; trois ou quatre fois dans les deux mois. Point d'être, cela le corrige.

Obtenez une liste de vos fichiers.

Lorsque la mise à jour échoue dans la fenêtre de votre 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 mettez-la dans un fichier. J'ai utilisé nano et ai nommé le mien "fichiers", comme dans ~ / work / files .

  • Supprimer les informations superflues:

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

    Cela prend le deuxième "mot" de chaque ligne et l’imprime dans files2.

Traiter les fichiers

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

  • Si quelque chose se brise, il est plus facile de 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, il n’ya aucune raison de le faire ( DANGER DANGER ): while read -r file; faire sudo rm - "$ file"; done <fichiers2

Mise à jour

  • Pour que --overwrite fonctionne, ce que nous devons faire pour que pacman réalise que le paquet n'est pas endommagé, 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 j'ai supprimé le lien symbolique libidn2.so.0, rien n'a fonctionné, et lorsque je l'ai remis en arrière, j'ai eu 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

Après que pacman a finalement déconseillé l’ --forceoption et que l’ --overwriteoption de substitution fonctionne comme prévu, il convient de noter le modèle d’utilisation suivant.

Une commande équivalente pour reproduire une --forceoption qui écrase aveuglément tout ce qui est en conflit sera:

sudo pacman -S --overwrite \*

Ou

sudo pacman -S --overwrite "*"

La partie la plus délicate est d’échapper au glob pour éviter que le shell le développe en premier.


Cela fonctionne parfaitement, merci!
EkriirkE

0

Si vous avez beaucoup de fichiers comme moi,

sudo pacman --force -Syyu  

résout tous les problèmes.


l'option --force est obsolète; use --overwrite à la place
Mahmoud Khaled

--overwrite semble devoir spécifier ce qu'il faut écraser. utilise actuellement --force tout va bien
xsilen T
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.