Bagaimana saya bisa menurunkan versi paket tanpa menghapus tanggungannya?

17

Saya memiliki sejumlah paket mesa yang telah saya tingkatkan ke versi PPA, sebelum membersihkan PPA sehingga saya dapat memutakhirkan sistem saya. Perbedaan dalam versi adalah minor (secara teknis sama, hanya satu set perpustakaan dari git dan yang lainnya adalah versi final).

Jika saya mencoba untuk menurunkan versi melalui Synaptic, apt-get, atau aptitude, saya akan dilempar ke neraka ketergantungan.

Apakah ada cara untuk menurunkan versi paket secara manual (mungkin satu per satu) dan menandai paket dependen mereka sebagai tidak bergerak (jika itu masuk akal) sampai saya selesai?

PS pertanyaan ini: Bagaimana Cara Turunkan Paket melalui apt-get? sedikit berbeda dan tidak membantu situasi ini.

RolandiXor
sumber
Kenapa kamu tidak ppa-purgeduluan?
landroni
Anda dapat menginstal ulang paket tersebut. Misalnya jika Anda menggunakan synaptic, ketika Anda memilih paket xyz, semua dependensi akan dipilih secara default. Tetapi Anda selalu dapat membatalkan pilihan semua dependensi dan cukup menginstal paket utama. ini hanya berfungsi jika Anda siap menginstal ulang.
Pengguna Terdaftar
@ Landroni jika saya membersihkan, itu akan menghapus paket yang tidak ingin saya hapus.
RolandiXor

Jawaban:

13

Saya tidak pernah bermain dengan ini sebelumnya, tetapi saya akan menyarankan Anda hold(atau lock) versi dependensi yang menyebabkan Anda kesulitan. Cara ini aptmemiliki sejumlah kemungkinan solusi yang lebih terbatas, dan mungkin tidak menjadi bingung ketika Anda mencoba untuk menurunkan versi paket lainnya.


Jika tidak ada yang berhasil, Anda dapat mengambil pendekatan manual yang disarankan dalam jawaban ini: Bagaimana Cara Menurunkan Paket melalui apt-get? . Pada dasarnya, download diperlukan .debpaket secara manual, kemudian menginstalnya satu persatu menggunakan lebih rendah-tingkat dpkgdan salah satu argumen kuat nya: --ignore-depends, --force-depends, --force-depends-version, atau bahkan --force-all.

Dengan semangat yang sama seperti di atas, Anda memiliki --force-downgradeargumen:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Tetapi ini mengasumsikan bahwa Anda telah membaca man dpkg, dan bahwa Anda memahami apa yang Anda lakukan:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Lihat Kesalahan: nomor versi tidak dimulai dengan angka dan Bagaimana menginstal versi Java yang lebih lama dan Bagaimana menginstal versi paket yang lebih lama seperti liquid 2.2.2? untuk contoh:

sudo dpkg --force-downgrade -i your_mesa_package.deb

Dan lihat Bagaimana saya bisa menginstal paket tanpa menginstal beberapa dependensi? untuk contoh (bersama dengan peringatan yang sesuai) dari:

sudo dpkg --force-all -i your_mesa_package.deb

Namun pendekatan lain adalah membuat .debpaket boneka menggunakan equivspaket (dan mungkin nama yang sedikit berbeda). Kemudian menginstal paket dummy akan memungkinkan Anda untuk menghapus paket "true" sambil menyimpan deps yang relevan, dan kemudian menginstal versi yang lebih lama. Saya tidak yakin bagaimana tepatnya ini akan bekerja, tetapi periksa utas yang relevan ini untuk perincian: Cara menghapus deb tanpa menghapus ketergantungannya .

Landroni
sumber
4

Pertama-tama Anda dapat menggunakan apt-markuntuk menandai semua dependensi paket target (dan mungkin yang disarankan / disarankan juga) yang diinstal dalam sistem sebagai instalasi manual . Setelah melakukan itu, instal versi perangkat lunak sebelumnya dengan apt-getmenyebutkan versi secara eksplisit.

  • Untuk membuat daftar ketergantungan, paket yang disarankan dan yang disarankan untuk paket target:

    apt-cache show <target-package-name>
    
  • Menandai paket yang diinstal secara manual :

    sudo apt-mark manual <package-name(s)>
    

    (gunakan ini untuk semua dependensi, rekomendasi dan saran.)

  • Hapus paket target:

    sudo apt-get remove <target-package-name>
    
  • Untuk melihat daftar versi paket yang dapat Anda turunkan / tingkatkan ke, gunakan:

    apt-cache policy <target-package-name>
    
  • Instal versi target dari paket yang diperlukan:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    atau

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Jika daftar paket dependensi / yang disarankan / disarankan yaitu paket yang ditandai dengan apt-markbesar, simpan daftar keluaran paket yang dimaksud dengan apt-cache show <target-package-name>ke file apa saja /path/to/foodan gunakan apt-markdalam kombo seperti ini:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
tepat
sumber
Metode ini mungkin berhasil, tetapi alih-alih menandai lebih dari 100 paket, saya hanya memilih jawaban yang lain.
RolandiXor
@Randiandi, Anda dapat menggunakan apt-cache policy <target-package-name>daftar versi paket yang dapat Anda turunkan / tingkatkan ke ..
tepat
..silakan lihat edit yang dilakukan pada posting; jika jumlah file yang lebih besar ditandai, Anda dapat menggunakan perintah kombo yang disertakan ...
tepatnya
Saya tidak berpikir Anda mengerti saya. Ngomong-ngomong, aku sudah memperbaikinya sekarang dan aku sudah memberikan hadiahnya (tidak bisa mengubahnya).
RolandiXor
1

Saya baru saja mengalami kesulitan mengupgrade ke versi hulu dari sebuah paket dan kemudian memutuskan untuk menurunkan versi. Ini adalah melalui repositori pribadi pengelola. Dalam kasus saya ini semua tentang mencoba versi systemd 233 terbaru (belum dirilis).

Kuncinya adalah untuk memahami bahwa Anda perlu menentukan semua paket yang harus diturunkan. Jika Anda melakukan ini dengan benar, kemungkinan besar akan melakukan apa yang Anda inginkan. Jika Anda melewatkan sesuatu, apt akan memberi tahu Anda bahwa tindakan tersebut akan menyebabkan banyak paket dihapus. Untuk memastikan kami menggunakan bendera '-s' untuk mencoba downgrade sebelum benar-benar melakukannya.

Langkah-langkah yang perlu Anda ambil adalah sebagai berikut:

1) Daftar semua dependensi yang ditingkatkan ke hulu (gunakan beberapa kata kunci lain jika situasinya berbeda):

dpkg -l|grep upstream

Ini memberi Anda daftar paket dengan nomor versi hulu.

2) Daftar apa versi stabil yang benar untuk setiap paket:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Periksa semuanya baik-baik:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(tidak yakin apakah --reinstall diperlukan btw, tapi ini yang saya lakukan)

4) Hapus -s dan lakukan.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
pengguna2427436
sumber