pacman errore "esiste sul filesystem"


38

Ho corso sudo pacman -Syue ho avuto alcuni errori interessanti nella lettura:

errore: impossibile eseguire il commit della transazione (file in conflitto)

e un lungo elenco di file seguito da exists in filesystem. L'output completo è qui: http://ix.io/lLw

Sembra che molti di questi file non siano associati a un pacchetto quando li ho controllati pacman -Qo <path-to-file>, ma non li ho controllati tutti. Ho avuto una connessione debole quando ho eseguito pacman -Syu, ma ottengo gli stessi errori quando ho aggiornato in seguito: http://ix.io/lLx

Cosa dovrei fare? Devo controllare tutti i file ed eliminare quelli che non hanno un pacchetto associato? Devo forzare l'aggiornamento (con sudo pacman -S --force <package-name>?)

Aggiornare

Ho provato a correre sudo pacman -S --force <package-name>e ho ottenuto questo:

[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

Sembra pacman -S --force <packageche non sovrascriva le directory che contengono file. Dall'uomo:

L'uso di --force non consentirà di sovrascrivere una directory con un file o di installare pacchetti con file e directory in conflitto.

Devo solo eliminare le directory in conflitto? (non hanno pacchetti associati)


5
perché hai file in conflitto in primo luogo? quando si utilizza un gestore di pacchetti, cercare di non toccare le dita dei piedi (ad esempio installando software in luoghi che il gestore di pacchetti ritiene giustamente loro; se è necessario installare le cose manualmente, installare /usr/local/invece che /usr/)
umläute

1
@ umläute Non sono esattamente sicuro da dove provengano i file in conflitto, ma sospetto che siano correlati alla mia installazione di docker-compose che ho installato usando sudo pip install -U docker-compose==1.5.0rc3 in questa pagina . Forse è in sudo pip installconflitto con pacman?
Modulitos,

2
@ umläute Ottenere -Saggiornamenti errati (installazioni parziali, ecc.) ti consentirà quello scenario. Caso di me ha --forcefunzionato tutte le volte.
m3nda,

Risposte:


28

Ok, sembra che funzioni in esecuzione sudo pacman -S --force <package-name>, ma non risolve directory in conflitto. In tali casi, in esecuzione sudo rm -rfsu directory in conflitto, seguite da sudo pacman -S --force <package-name>lavori.

Ora il mio si pacman -Syurisolve bene.


6
- force è deprecato; usa invece --overwrite.
Ankit Balyan,

7
- La forza funziona per me ma
sovrascrivere

3
sudo pacman -Syu --forceha funzionato per me, ma la sovrascrittura non è stata riconosciuta.
spydon,

21

tl; dr: disinstalla l'applicazione in conflitto prima di eseguirla pacman.

pacman(e altri gestori di pacchetti) mantengono un indice di pacchetti e file che gestiscono ( pacman --query --list). Alcuni file, come la configurazione, saranno contrassegnati come modificabili e non verranno sovrascritti durante l'aggiornamento (tranne in circostanze speciali, in cui il gestore dei pacchetti in genere sposta il vecchio file prima di crearne uno nuovo). Gli altri file saranno contrassegnati come non modificabili. Se un'altra applicazione modifica tali file in alcun modo senza aggiornare di conseguenza l'indice, non è possibile che il gestore pacchetti sappia cosa fare con tali file durante un aggiornamento.

Molte applicazioni installate utilizzando il ./configure && make && sudo make installmodello standard possono essere disinstallate utilizzando sudo make uninstall. Se l'applicazione è stata installata in qualche altro modo, potrebbe essere necessario qualcos'altro per disinstallarla. In generale, può essere una buona idea conservare una copia dei file di installazione da qualche parte (ad esempio ~/install) per poterli disinstallare in modo affidabile in questi casi. La semplice rimozione dei file in conflitto probabilmente lascerà in giro altri file, il che potrebbe probabilmente causare altri problemi.

Quando si installa software con altri gestori di pacchetti, esistono modi per isolarli dai file di sistema. Questa è una best practice consolidata, ad esempio durante lo sviluppo di software, in cui si desidera davvero mantenere coerenti le versioni ed evitare conflitti con altri software. Esempi inclusi:


2
Vedi il mio commento a @umlaute sopra. Penso che il conflitto provenisse da un sudo pip installcomando. Forse dovrei evitare di usare pip con sudo?
Modulitos,


2

TLDR;

  1. Ottieni un elenco dei file offensivi (copia e incolla l'output di pacman in un file).
  2. Usa awk per eliminare tutto tranne i percorsi dei file in un nuovo elenco.
  3. Utilizzare while per spostare i file offensivi, in base all'elenco.
  4. Corri di sudo pacman -Syunuovo.

    modificato per aggiungere TLDR e correggere errori di battitura

Anche se sono abbastanza sicuro di non aver fatto nulla di stupido, ho avuto questo problema forse ogni volta che ho provato ad aggiornare da quando utilizzo Manjaro; tre o quattro volte entro due mesi. Il punto è che questo lo risolve.

Ottieni un elenco dei tuoi file.

Quando l'aggiornamento non riesce nella finestra del terminale, si ottiene questo:

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

... e molto di più.

  • Copia l'output dal terminale e inseriscilo in un file. Ho usato nano e ho chiamato i miei "file", come in ~ / work / files .

  • Rimuovi informazioni estranee:

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

    Questo prende la seconda "parola" da ogni riga e la stampa su files2.

Gestisci i file

  • Puoi eliminarli, spostarli o rinominarli.

  • Se qualcosa si rompe, è più facile ripararlo se lo rompiamo spostandolo invece di eliminarlo o rinominarlo:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Se vuoi davvero eliminarli, cosa che non c'è motivo di fare ( PERICOLO PERICOLO ): durante la lettura del file -r; do sudo rm - "$ file"; fatto <files2

In aggiornamento

  • Per ottenere --overwrite per funzionare, cosa che dobbiamo fare per ottenere pacman per renderci conto che il pacchetto non è rotto, è necessaria la sintassi seguente:

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

    • Nel mio caso: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Di seguito l'esempio: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Ho avuto un bel problema a causa del quale se avessi cancellato il symlink libidn2.so.0, nulla avrebbe funzionato, e quando lo avrei rimesso, avrei ricevuto l'errore "esiste sul filesystem". Quanto sopra, con --overwrite, è tutto ciò che ha funzionato per me.

  • Finalmente:

    sudo pacman -Syu


2

Dopo che pacman alla fine ha deprecato l' --forceopzione e per far funzionare l' --overwriteopzione surrogata come previsto, è necessario notare il seguente modello di utilizzo.

Un comando equivalente per riprodurre l' --forceopzione che sovrascrive ciecamente qualsiasi cosa sia in conflitto sarà:

sudo pacman -S --overwrite \*

O

sudo pacman -S --overwrite "*"

La parte difficile è sfuggire al glob per evitare che shell lo espanda prima.


Funziona perfettamente, grazie!
EkriirkE

0

Se hai molti file come me,

sudo pacman --force -Syyu  

risolve tutti i problemi.


opzione - force è deprecato; usa --overwrite invece
Mahmoud Khaled il

--overwrite sembra che debba specificare cosa sovrascrivere. attualmente uso --force tutto va bene
xsilen T
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.