Bagaimana cara menghapus semua paket dari repositori tertentu?

30

Untuk peningkatan yang lancar dari 10,04 menjadi 10,10, saya ingin menghapus semua paket yang tidak dalam repositori default (mis. Kromium PPA dan repositori pihak ketiga). Apa cara termudah (lebih disukai CLI) untuk menemukan dan menghapus paket-paket ini?

Sunting: pertanyaan ini tidak terbatas pada PPA, saya punya repositori x2go juga, jadi saya mencari perintah generik untuk menghapus paket milik repositori tertentu. Untuk PPA, pertanyaan Bagaimana menghapus PPA memiliki jawaban yang bagus.

Lekensteyn
sumber
Bagi mereka yang ingin menghapus semua paket eksternal, nonaktifkan semua PPA dan gunakan code.google.com/p/apt-downgrade
Lekensteyn

Jawaban:

12

Skrip ini dapat mencantumkan semua paket dari server / cabang tertentu (memodifikasi dua variabel yang dideklarasikan):

#!/bin/bash

server="http://it.archive.ubuntu.com/ubuntu/"
branch="maverick-updates/main"

apt-cache policy $(dpkg -l | awk 'NR >= 6 { print $2 }') |
  awk -v server="$server" -v branch="$branch" \
    '/^[^ ]/      { split($1, a, ":"); pkg = a[1] }
    nextline == 1 { nextline = 0; if ($2 == server && $3 == branch) print pkg }
    /\*\*\*/      { nextline = 1 }'

jika Anda perlu mendaftar semua paket yang tidak berasal dari server tertentu, terlepas dari cabang, ganti baris berikutnya-ke-terakhir dengan:

nextline == 1 { nextline = 0; if ($2 != server) print pkg }
enzotib
sumber
1
Bukan apa yang sebenarnya saya cari, skrip ini hanya menampilkan semua paket dari entri repositori tertentu. Dengan mengganti $2 == server && $3 == branchdengan $2 != server, pertanyaan saya dijawab. Harap cantumkan dalam jawaban Anda :) ( branch=baris dapat dihapus) Catatan: diasumsikan bahwa semua paket berasal dari satu server repositori.
Lekensteyn
1
Skrip ini (sedikit dimodifikasi per komentar terakhir saya) berfungsi seperti yang diharapkan. The libvpx0paket ada di kedua repo utama seperti dalam PPA kromium-hari. Setelah mengeluarkan repositori dari /etc/apt/sources.list.d, saya punya masih paket kiri-atas: libvpx0. Aku "diperbaiki" ini sebagai berikut: menghapus perpustakaan dengan dpkg, mengabaikan dependensi: sudo dpkg --ignore-depends=libvpx0 --remove libvpx0. Berikutnya, menginstal lagi dari repo utama: sudo apt-get install libvpx0.
Lekensteyn
1
@Lekensteyn: mungkin Anda dapat mempersingkat pekerjaan Anda sudo apt-get install libvpx0=$version_string, seandainya dua paket yang tersedia memiliki string versi yang berbeda.
enzotib
memang, itu mungkin juga dan mungkin lebih baik juga.
Lekensteyn
Saya hanya perlu memeriksa paket mana yang tidak diinstal dari repo default. Perintahnya apt-cache policy $(dpkg -l | awk '/^ii/{print $2}') > policy.txt; awk '!/^ /{pkg=$1}check{print pkg, $2;check=0}/\*\*\*/{check=1} ' policy.txt | grep -v archive.ubuntuadalah awal yang baik (tambahkan lebih banyak grep -vuntuk mengecualikan PPA tertentu). Versi paket yang tidak dikenal dalam repo apa pun muncul sebagai /var/lib/dpkg/status.
Lekensteyn
22

Lihat pembersihan ppaInstal ppa-purge .

Pemakaian:

ppa-purge -purge <nameofppa> [-s hostserver]

Hostserver default untuk ppa.launchpad.net.

Berikut ini tautan ke halaman manual untuk ppa-purgeperintahIkon halaman manual untuk referensi.

Vadim Rutkovsky
sumber
Atau Anda bisa menggunakan cabang ppa-purge saya yang memiliki banyak perbaikan bug dan peningkatan atas ppa-purge di repositori universe. Lihat di sini untuk informasi lebih lanjut.
jarno
18

Mengatasi aptitudeBug Multiarch untukppa-purge

Biasanya, sebagai Vadim Rutkovsky dan Takkat telah menjelaskan , berjalan ppa-purgedengan sintaks default adalah cara yang efektif untuk menghilangkan semua paket yang disediakan oleh PPA, benar merendahkan mereka untuk versi yang disediakan dalam sumber-sumber perangkat lunak lain dikonfigurasi bila memungkinkan.

Namun, seperti yang ditunjukkan Takkat, bug 831768 mencegah ppa-purgebekerja dengan benar untuk menghapus paket multiarch (seperti paket 32-bit yang diinstal pada sistem 64-bit). Ini karena aptitudetidak dapat menangani dependensi yang saling bertentangan dalam paket multiarch (itulah masalahnya tentang bug), dan perilaku default ppa-purgeuntuk digunakan adalah aptitudemenurunkan versi paket.

Untungnya, ppa-purgemenerima -ibendera yang menyebabkan ia lebih memilih apt-getuntuk aptitudesebagai backend. Seperti yang didokumentasikan dalam laporan bug, menggunakan apt-getadalah alternatif yang efektif untuk memohon secara manual aptitude, jadi menjalankan ppa-purgedengan -iflag harus menjadi solusi yang efektif untuk menghapus / menurunkan semua paket yang disediakan oleh PPA, termasuk paket multiarch .

Bagaimana cara melakukannya

Inilah sintaksinya:

sudo ppa-purge -i ppa:ppaowner/ppaname

Seperti biasa (sama seperti saat -ibendera tidak digunakan):

  • ppaowner diganti dengan pemilik PPA.
  • /ppanameadalah opsional. Jika ada, ppanamediganti dengan nama PPA. Jika tidak, defaultnya adalah ppa.

Sebagai contoh , misalkan saya memiliki PPA untuk build tidak stabil dari qBittorrent yang diinstal, dan saya ingin menghapusnya sepenuhnya, secara otomatis menurunkan versi qBittorrent ke versi apa pun yang tersedia melalui sumber perangkat lunak saya yang lain menggunakan di apt-getbelakang layar alih-alihaptitude . Maka saya akan lari:

sudo ppa-purge -i ppa:hydr0g3n/qbittorrent-unstable

Di mana itu didokumentasikan

Untuk beberapa alasan, beberapa opsi berguna untuk ppa-purgetidak didokumentasikan di halaman manualnya , termasuk -i. Tetapi Anda bisa mendapatkan informasi tentang mereka dengan menjalankan ppa-purge -h(atau hanya ppa-purgetanpa argumen):

ek@Del:~$ ppa-purge -h
Usage: sudo ppa-purge [options] <ppa:ppaowner>[/ppaname]

ppa-purge will reset all packages from a PPA to the standard
versions released for your distribution.

Options:
    -p [ppaname]        PPA name to be disabled (default: ppa)
    -s [host]       Repository server (default: ppa.launchpad.net)
    -d [distribution]   Override the default distribution choice.
    -y          Pass -y --force-yes to apt-get or -y to aptitude
    -i          Reverse preference of apt-get upon aptitude.
    -h          Display this help text

Example usage commands:
    sudo ppa-purge xorg-edgers
    will remove https://launchpad.net/~xorg-edgers/+archive/ppa

    sudo ppa-purge -p xorg-testing sarvatt
    will remove https://launchpad.net/~sarvatt/+archive/xorg-testing

    sudo ppa-purge ppa:ubuntu-x-swat/x-updates
    will remove https://launchpad.net/~ubuntu-x-swat/+archive/x-updates

Notice: If ppa-purge fails for some reason and you wish to try again,
(For example: you left synaptic open while attempting to run it) simply
uncomment the PPA from your sources, run apt-get update and try again.

"Membalikkan preferensi apt-get upon aptitude" agak samar. Dengan melihat potongan yang relevan dari kode sumber ( ppa-purgehanya shell script, setelah semua), kita dapat melihat bahwa ini berarti bahwa perilaku default adalah untuk lebih memilih aptitudeuntuk apt-get, dan -ibendera membalikkan preferensi ini.

Eliah Kagan
sumber
Terakhir kali ketika saya mencoba ppa-purge, itu tidak menghapus paket yang telah dihapus dari PPA. Apakah masih demikian?
Lekensteyn
@Lekensteyn Ya, saya percaya bahwa masih ada kasus yang tidakppa-purge akan menghapus atau menurunkan paket yang tidak lagi disediakan oleh PPA yang "dihapus." Namun, Anda mungkin ingin memposting pertanyaan terpisah tentang ini, untuk mendapatkan jawaban yang lebih otoritatif atau terdokumentasi dengan baik.
Eliah Kagan
Jika repositori bukan PPA yang di-host di Launchpad, tetapi repositori non-standar lainnya, akankah ppa-purge berfungsi?
Anwar
1
@ Anwar Saya tidak yakin apakah itu akan berhasil, tetapi Anda harus dapat mencoba dengan menentukan URL repositori lengkap sebagai gantinya ppa:username/path. PPA juga harus DIAKTIFKAN sebelum Anda mencoba membersihkannya, meskipun skrip segera dinonaktifkan setelah memperbarui daftar paket yang akan dihapus, itu tidak akan "menemukan" PPA yang sudah dinonaktifkan.
dragon788
1
@Lekensteyn Anda dapat mencoba menggunakan aptitude search ~ountuk menemukan paket-paket yatim tanpa sumber instalasi jika Anda perlu membersihkan sesuatu yang dihapus dari PPA (atau diinstal sebagai yang salah melalui dpkg -i).
dragon788
6

Berikut adalah cara GUI untuk melakukannya. Semoga ini bisa membantu bagi mereka yang tidak suka CLI. Langkah-langkahnya sederhana dan mudah diikuti.

  1. Buka pengelola paket sinaptik . Jika tidak diinstal maka instal dengan:

    sudo apt-get install synaptic
    
  2. Ketika dibuka klik pada tombol Asal di kiri bawah. Ini akan mencantumkan semua repositori di sisi kiri atas. Pilih repositori tertentu untuk menghapus paket mana. Ini akan mencantumkan semua paket di dalam repositori itu. Klik bidang pertama bidang I, e S atau Versi Terpasang untuk menampilkan paket yang diinstal terlebih dahulu.

  3. Sekarang pilih semua paket untuk dihapus.

    Kiat untuk dihapus:

    1. Pilih paket pertama lalu tahan Shifttombol dan pilih lagi paket terakhir untuk memilih semua. Kemudian klik kanan pada kotak persegi dan pilih tanda untuk dihapus atau tanda untuk penghapusan lengkap .

    2. atau Pilih paket apa saja dan tekan Ctrl+ Auntuk memilih semua. Kemudian klik kanan pada kotak persegi dan pilih tanda untuk dihapus atau tanda untuk penghapusan lengkap.

Itu dia. Itu akan dihapus tanpa masalah. Saya juga melampirkan gambar untuk membuatnya lebih jelas. Semoga ini bisa membantu. :)

gambar

Saurav Kumar
sumber
5

Untuk setidaknya menemukannya, mulai dengan menonaktifkan PPA dan jalankan apt-get update. Kemudian instal apt-show-versions. Menjalankan apt-show-versions | grep 'No available'kemudian akan memberi Anda daftar semua paket yang diinstal yang tidak dapat ditemukan di repositori yang dikonfigurasi. Dengan sihir baris perintah, Anda mungkin dapat menghapus hanya nama paket dan meneruskannya ke apt-get remove:

 for i in `apt-show-versions | grep 'No available' | cut -d' ' -f 1` ; do  sudo apt-get remove -y $i ; done

Perhatikan bahwa ini akan melalui daftar yang dikembalikan dari apt-show-versionsdan menghapusnya satu per satu. Bergantung pada apa yang ditemukannya, ini bisa menghapus sesuatu yang tidak diinginkan karena ketergantungan, jadi periksa dulu.

Egil
sumber
Kedengarannya bagus, saya akan mencobanya.
Lekensteyn
3
Proses pemutakhiran itu sendiri juga akan otomatis PPA, meskipun saya cukup yakin itu tidak akan pergi dan menghapus semua paket yang tersisa.
Jorge Castro
@ Jorge: Saya memang memperhatikan bahwa PPA dinonaktifkan (dikomentari), tetapi tidak menghapus paket. Saya pikir lebih baik untuk menghapus paket sebelum versi baru dari repositori Ubuntu menimpa file.
Lekensteyn
Saya baru saja menguji ini dan tidak membuat perbedaan antara paket dari repo utama dan PPA. Dalam kasus saya, itu adalah libvpx0paket dari PPA harian kromium. Jawaban @ enzotib memang menunjukkan paket ini.
Lekensteyn
Jika Anda menjalankan apt-show-versionssebagai non-root, itu perlu sudo apt-show-versions -imemperbarui cache itu dan melihat perubahan dari repositori / PPA yang baru dihapus (jika tidak, itu hanya diperbarui melalui pekerjaan cron.daily)
Xen2050
0

Saya menemukan penggunaan ppa-purge menjadi sulit.

Buka Synaptic Package Manager di bawah System, lalu pilih Pengaturan, Repositori.

Hapus yang tidak Anda inginkan.

Selesai!

Joe
sumber
4
Ini hanya menghapus sumber paket, itu tidak menghapus paket dari sumber-sumber itu.
Lekensteyn