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)
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.
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:
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.
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
Sudo pacman -Syu
encore. 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.
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.
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
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
Sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
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
Si vous avez beaucoup de fichiers comme moi,
Sudo pacman --force -Syyu
résout tous les problèmes.