Ich bin gelaufen sudo pacman -Syu
und habe beim Lesen einige interessante Fehlermeldungen bekommen:
Fehler: Transaktion konnte nicht bestätigt werden (konfliktierende Dateien)
und eine lange Liste von Dateien, gefolgt von exists in filesystem
. Die vollständige Ausgabe finden Sie hier:http://ix.io/lLw
Es scheint, dass viele dieser Dateien keinem Paket zugeordnet sind, als ich sie mit überprüft habe pacman -Qo <path-to-file>
, aber ich habe nicht alle überprüft. Ich hatte eine schwache Verbindung, als ich ausgeführt habe pacman -Syu
, aber ich erhalte die gleichen Fehler, wenn ich später aktualisiert habe:http://ix.io/lLx
Was soll ich tun? Soll ich alle Dateien prüfen und diejenigen löschen, denen kein Paket zugeordnet ist? Soll ich ein Update erzwingen (mit sudo pacman -S --force <package-name>
?)
Aktualisieren
Ich habe es versucht sudo pacman -S --force <package-name>
und das hier kam:
[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
Es sieht so aus, als ob pacman -S --force <package
Verzeichnisse, die Dateien enthalten, nicht überschrieben werden. Von dem Mann:
Die Verwendung von --force ermöglicht nicht das Überschreiben eines Verzeichnisses mit einer Datei oder die Installation von Paketen mit in Konflikt stehenden Dateien und Verzeichnissen.
Soll ich einfach die in Konflikt stehenden Verzeichnisse löschen? (Sie haben keine zugehörigen Pakete)
Antwort1
Nachdem Pacman die --force
Option schließlich verworfen und dafür gesorgt hat, dass die Ersatzoption --overwrite
wie erwartet funktioniert, sollte das folgende Verwendungsmuster beachtet werden.
Ein Befehl zum Reproduzieren der --force
Option, die blind alle Konflikte überschreibt, lautet wie folgt:
sudo pacman -S --overwrite \* <package_name>
Oder
sudo pacman -S --overwrite "*" <package_name>
Der schwierige Teil besteht darin, das Platzhalterzeichen zu umgehen, um zu verhindern, dass die Shell es zuerst erweitert.
Antwort2
Ok, es sieht so aus, als ob das Ausführen sudo pacman -S --force <package-name>
funktioniert, aber es löst keine Verzeichniskonflikte auf. In solchen Fällen funktioniert das Ausführen sudo rm -rf
in den Verzeichnissen, gefolgt von sudo pacman -S --force <package-name>
.
Nun pacman -Syu
gut, mein Vorsatz.
Antwort3
tl;dr: Deinstallieren Sie die in Konflikt stehende Anwendung, bevor Sie sie ausführen pacman
.
pacman
(und andere Paketmanager) führen eineIndex der Pakete und Dateiendie sie verwalten ( pacman --query --list
). Einige Dateien, wie z. B. Konfigurationsdateien, werden als veränderbar markiert und beim Upgrade nicht überschrieben (außer in besonderen Fällen, in denen der Paketmanager normalerweise die alte Datei wegschiebt, bevor er die neue erstellt). Andere Dateien werden als nicht veränderbar markiert.Wenn eine andere Anwendung diese Dateien in irgendeiner Weise ändert, ohne den Index entsprechend zu aktualisieren, weiß der Paketmanager nicht, was bei einem Upgrade mit diesen Dateien zu tun ist.
Viele Anwendungen, die mit dem Standardmuster installiert wurden, ./configure && make && sudo make install
können deinstalliert werden mitsudo make uninstall
. Wenn Sie die Anwendung auf andere Weise installiert haben, müssen Sie sie möglicherweise auf andere Weise deinstallieren. Im Allgemeinen kann es eine gute Idee sein,Bewahren Sie eine Kopie der Installationsdateien aufirgendwo (zum Beispiel ~/install
), um sie in solchen Fällen zuverlässig deinstallieren zu können. Wenn Sie nur die widersprüchlichen Dateien entfernen, bleiben wahrscheinlich andere Dateien übrig, was möglicherweise andere Probleme verursachen könnte.
Beim Installieren von Software mit anderen Paketmanagern gibt es Möglichkeiten, diese von den Systemdateien zu isolieren. Dies ist beispielsweise bei der Softwareentwicklung eine bewährte Vorgehensweise, bei der Sie die Versionen unbedingt konsistent halten und Konflikte mit anderer Software vermeiden möchten. Beispiele hierfür sind:
Antwort4
Kurz und knapp;
- Holen Sie sich eine Liste der fehlerhaften Dateien (kopieren Sie die PacMan-Ausgabe und fügen Sie sie in eine Datei ein).
- Verwendenawkum alles außer den Dateipfaden in eine neue Liste zu entfernen.
- Verwendenwährendum die fehlerhaften Dateien basierend auf der Liste aus dem Weg zu räumen.
- Führe es
sudo pacman -Syu
nochmals aus.
bearbeitet, um TLDR hinzuzufügen und Tippfehler zu korrigieren
Obwohl ich ziemlich sicher bin, dass ich nichts Dummes getan habe, hatte ich dieses Problem vielleicht bei jedem zweiten Update-Versuch, seit ich Manjaro verwende; drei oder vier Mal innerhalb von zwei Monaten. Der Punkt ist, dass dies das Problem behebt.
Holen Sie sich eine Liste Ihrer Dateien.
Wenn das Update in Ihrem Terminalfenster fehlschlägt, erhalten Sie Folgendes:
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
... und vieles mehr.
Kopieren Sie die Ausgabe vom Terminal und speichern Sie sie in einer Datei. Ich habeNanometerund nannte meine "Dateien", wie in~/Arbeit/Dateien.
Überflüssige Informationen entfernen:
cat files | awk '{print $2}' >> ~/work/files2
Dies nimmt das zweite „Wort“ aus jeder Zeile und druckt es in Dateien2.
Umgang mit den Dateien
Sie können sie löschen, verschieben oder umbenennen.
Wenn etwas kaputt geht, lässt es sich am einfachsten reparieren, indem wir es verschieben, anstatt es zu löschen oder umzubenennen:
mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2
Wenn Sie sie wirklich löschen möchten (wofür es keinen Grund gibt) (GEFAHR GEFAHR):während lesen -r Datei; mache sudo rm -- "$file"; fertig < Dateien2
Aktualisierung
Damit --overwrite funktioniert (was wir tun müssen, damit Pacman erkennt, dass das Paket nicht beschädigt ist), benötigen Sie die folgende Syntax:
sudo pacman -S package_name --overwrite /location/of/thing
- In meinem Fall:
sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
- Nach dem Beispiel:
sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
- In meinem Fall:
Ich hatte ein nettes Problem: Wenn ich den symbolischen Link libidn2.so.0 löschte, funktionierte nichts mehr, und als ich ihn wieder einfügte, bekam ich den Fehler „existiert im Dateisystem“. Das Obige mit --overwrite ist alles, was bei mir funktioniert hat.
Endlich:
sudo pacman -Syu