pacman "ada pada sistem file" kesalahan

38

Saya berlari sudo pacman -Syudan saya mendapatkan beberapa kesalahan menarik:

kesalahan: gagal melakukan transaksi (file yang bertentangan)

dan daftar panjang file yang diikuti oleh exists in filesystem. Output lengkapnya ada di sini: http://ix.io/lLw

Tampaknya banyak dari file-file ini tidak terkait dengan paket ketika saya memeriksanya pacman -Qo <path-to-file>, tetapi saya tidak memeriksa semuanya. Saya memiliki koneksi yang lemah ketika saya berlari pacman -Syu, tetapi saya mendapatkan kesalahan yang sama ketika saya memperbarui nanti: http://ix.io/lLx

Apa yang harus saya lakukan? Haruskah saya memeriksa semua file dan menghapus yang tidak memiliki paket terkait? Haruskah saya memaksakan pembaruan (dengan sudo pacman -S --force <package-name>?)

Memperbarui

Saya mencoba berlari sudo pacman -S --force <package-name>dan mendapatkan ini:

[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

Sepertinya pacman -S --force <packagetidak menimpa direktori yang berisi file. Dari pria itu:

Menggunakan --force tidak akan memungkinkan menimpa direktori dengan file atau menginstal paket dengan file dan direktori yang saling bertentangan.

Haruskah saya menghapus direktori yang bertentangan? (mereka tidak memiliki paket terkait)

modulitos
sumber
5
mengapa Anda memiliki file yang bertentangan di tempat pertama? ketika menggunakan manajer paket, cobalah untuk tidak mengetuk jari-jari kakinya (mis. dengan menginstal perangkat lunak di tempat-tempat yang menurut manajer paket adalah milik mereka; jika Anda harus menginstal sesuatu secara manual, instal ke /usr/local/bukan /usr/)
umläute
1
@ umläute Saya tidak yakin dari mana file yang berselisih itu berasal, tetapi saya curiga mereka terkait dengan instalasi saya dari docker-compose yang saya instal gunakan sudo pip install -U docker-compose==1.5.0rc3 pada halaman ini . Mungkin sudo pip installkonflik dengan pacman?
modulitos
2
@ umläute Mendapatkan -Spembaruan yang salah (pemasangan parsial, dll) akan membuat Anda skenario itu. Kasus saya --forcebekerja sepanjang waktu.
m3nda

Jawaban:

28

Ok, sepertinya menjalankan sudo pacman -S --force <package-name>karya, tetapi tidak menyelesaikan direktori yang bertentangan. Dalam kasus seperti itu, berjalan sudo rm -rfdi direktori yang bertentangan, diikuti oleh sudo pacman -S --force <package-name>karya.

Sekarang pacman -Syuketetapan hati saya membaik.

modulitos
sumber
6
--force sudah usang; gunakan --overwrite sebagai gantinya.
Ankit Balyan
7
Force
3
sudo pacman -Syu --forcebekerja untuk saya, tetapi menimpa tidak dikenali.
spydon
21

tl; dr: Hapus instalan aplikasi yang bertentangan sebelum dijalankan pacman.

pacman(dan manajer paket lainnya) menyimpan indeks paket dan file yang mereka kelola ( pacman --query --list). Beberapa file, seperti konfigurasi, akan ditandai sebagai dapat dimodifikasi dan tidak akan ditimpa selama pemutakhiran (kecuali dalam keadaan khusus, di mana manajer paket biasanya akan memindahkan file lama sebelum membuat yang baru). File lain akan ditandai sebagai tidak dapat dimodifikasi. Jika aplikasi lain mengubah file-file tersebut dengan cara apa pun tanpa memperbarui indeks sesuai dengan itu, tidak ada cara bagi manajer paket untuk mengetahui apa yang harus dilakukan dengan file-file tersebut selama upgrade.

Banyak aplikasi yang diinstal menggunakan ./configure && make && sudo make installpola standar dapat dihapus menggunakan sudo make uninstall. Jika Anda telah menginstal aplikasi dengan cara lain, Anda mungkin harus melakukan sesuatu untuk menghapusnya. Secara umum itu bisa menjadi ide yang baik untuk menyimpan salinan file instalasi di suatu tempat (misalnya ~/install) untuk dapat menghapusnya dengan andal dalam kasus seperti itu. Hanya menghapus file yang bertentangan mungkin akan meninggalkan file lain di sekitar, yang dapat menyebabkan masalah lain.

Ketika menginstal perangkat lunak dengan manajer paket lain ada cara untuk mengisolasi mereka dari file sistem. Ini adalah praktik terbaik yang mapan misalnya selama pengembangan perangkat lunak, di mana Anda benar-benar ingin menjaga versi konsisten dan menghindari konflik dengan perangkat lunak lain. Contohnya termasuk:

l0b0
sumber
2
Lihat komentar saya di @umlaute di atas. Saya pikir konflik berasal dari sebuah sudo pip installperintah. Mungkin saya harus menghindari menggunakan pip dengan sudo?
modulitos
3

Saya menginstal paket yang biasanya saya instal dengan pip via pacman karena ini. Tetapi beberapa paket tidak ditemukan di pacman repos. Saya pikir kita harus menghindari menginstal pip dengan hak akses sudo dan istead:

pip install pillow --user

--Pengguna flag membuat paket instalasi pip di direktori home Anda, yang tidak memerlukan hak khusus. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user

lava-lava
sumber
2

TLDR;

  1. Dapatkan daftar file yang menyinggung (salin dan tempel output pacman ke file).
  2. Gunakan awk untuk menghapus semuanya kecuali jalur file ke daftar baru.
  3. Gunakan sementara untuk memindahkan file yang menyinggung keluar dari jalan, berdasarkan daftar.
  4. Lari sudo pacman -Syulagi.

    diedit untuk menambahkan TLDR dan memperbaiki kesalahan ketik

Walaupun saya cukup yakin saya tidak melakukan hal bodoh, saya pernah mengalami masalah ini mungkin setiap kali saya mencoba memperbarui sejak saya menggunakan Manjaro; tiga atau empat kali dalam dua bulan. Intinya, ini memperbaikinya.

Dapatkan daftar file Anda.

Ketika pembaruan gagal di jendela terminal Anda, Anda mendapatkan ini:

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

... dan banyak lagi.

  • Salin output dari terminal, dan masukkan ke dalam file. Saya menggunakan nano , dan menamai saya "file," seperti di ~ / work / files .

  • Hapus info asing:

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

    Ini mengambil "kata" kedua dari setiap baris dan mencetaknya ke file2.

Menangani file

  • Anda dapat menghapusnya, memindahkannya, atau mengganti namanya.

  • Jika ada yang rusak, cara termudah untuk memperbaikinya adalah dengan memindahkannya alih-alih menghapus atau mengganti nama:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Jika Anda benar-benar ingin menghapusnya, yang tidak ada alasan untuk melakukannya ( BERBAHAYA BAHAYA ): saat membaca file -r; do sudo rm - "$ file"; selesai <files2

Memperbarui

  • Agar --overwrite berfungsi, yang perlu kita lakukan agar pacman menyadari bahwa paket tersebut tidak rusak, Anda memerlukan sintaks berikut:

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

    • Dalam hal ini: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Berikut contohnya: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Saya punya masalah lucu di mana jika saya menghapus symlink libidn2.so.0, tidak ada yang berhasil, dan ketika saya memasangnya kembali, saya mendapatkan kesalahan "exist on filesystem". Di atas, dengan --overwrite, adalah semua yang berhasil untuk saya.

  • Akhirnya:

    sudo pacman -Syu

Fin Hirschoff
sumber
2

Setelah pacman akhirnya --forceopsi usang dan untuk membuat --overwriteopsi pengganti bekerja seperti yang diharapkan, pola penggunaan ikuti harus dicatat.

Perintah yang setara untuk mereproduksi --forceopsi yang secara buta menimpa apa pun yang akan menjadi konflik:

sudo pacman -S --overwrite \*

Atau

sudo pacman -S --overwrite "*"

Bagian yang sulit adalah melarikan diri dari gumpalan untuk menghindari shell mengembangkannya terlebih dahulu.

nix
sumber
Ini bekerja dengan baik, terima kasih!
Mengecewakan
0

Jika Anda memiliki banyak file seperti saya,

sudo pacman --force -Syyu  

menyelesaikan semua masalah.

Mohamed Hedi Kestouri
sumber
opsi - memaksa sudah usang; gunakan --overwrite sebaliknya
Mahmoud Khaled
--overwrite tampaknya harus menentukan apa yang akan ditimpa. saat ini menggunakan
memaksa