Apakah mungkin untuk membatalkan perintah instalasi apt-get?

67

Saya menginstal Carpadio pada instal Xubuntu saya (Live USB), yang kemudian menarik lebih dari 50 paket dari, saya kira, sisi Ubuntu dari repositori. Sekarang saya ingin membatalkan ini. Namun untuk semua perburuan saya, saya tidak dapat menemukan sesuatu yang lebih berguna daripada Bagaimana saya bisa membalikkan sudo untuk mendapatkan perintah install , yang hanya menyarankan apt-get purge. Ini tidak berguna karena yang dilakukannya hanyalah menghapus 2 paket (carpadio dan carpadio-gnomepanel).

/var/log/apt/history.logmemiliki daftar semua paket yang diinstal bersama dengan perintah itu. Jadi saya bertanya-tanya apakah ada cara mudah untuk menghapus semuanya ? Kalau tidak, saya bisa menginstal ulang, ini adalah instalasi yang baru, tetapi saya ingin tahu.

Sampel kecil dari log riwayat (1 / 5-1 / 10 dari seluruh daftar)

Commandline: apt-get install cardapio-gnomepanel
Instal: libdbusmenu-qt2: amd64 (0.9.2-0ubuntu1, otomatis), python-packagekit: amd64 (0.7.2-4ubuntu3, otomatis), cups-pk-helper: amd64 (0.2.1.2-1ubuntu0.1, otomatis) , geoclue: amd64 (0.12.0-1ubuntu12, otomatis), unity: amd64 (5.18.0-0ubuntu1, otomatis), indikator-printer: amd64 (0.1.6-0ubuntu1, otomatis), libevolution: amd64 (3.2.3- 0ubuntu6, otomatis), libqt4-declarative: amd64 (4.8.1-0ubuntu4.3, otomatis), libmtp9: amd64 (1.1.3-1ubuntu0.1, otomatis), tracker-miner-fs: amd64 (0.14.0-2ubuntu1 , otomatis), gir1.2-rb-3.0: amd64 (2.96-0ubuntu4.2, otomatis), python-aptdaemon.pkcompat: amd64 (0.43 + bzr805-0ubuntu7, otomatis), gnome-media: amd64 (3.4.0- 0ubuntu3.1, otomatis), metacity: amd64 (2.34.1-1ubuntu11, otomatis), nautilus: amd64 (3.4.2-0ubuntu6, otomatis), libcompizconfig0: amd64 (0.9.7.0 ~ bzr428-0ubuntu6, otomatis), compiz- plugin-default:amd64 (0.9.7.12-0ubuntu1, otomatis), libunistring0: amd64 (0.9.3-5, otomatis), libebackend-1.2-1: amd64 (3.2.3-0ubuntu7, otomatis), ubuntu-docs: amd64 (12.04.6 , otomatis), python-mako: amd64 (0.5.0-1, otomatis),

Untuk semua yang telah menyarankan autoremove: Saya tidak yakin mengapa, tapi saya hanya punya 1 paket terkait python lainnya (python-keybinder atau sesuatu) sebagai "tidak perlu" dan hanya itu yang bisa dihapus oleh autoremove.

Antara menginstal dan menghapus instalan, hanya perubahan besar yang menginstal xubuntu-restricted-extras.

Karthik T
sumber
4
Agak terlambat untuk membantu dalam kasus ini, tetapi pada saat Anda ingin menginstal sesuatu, pertimbangkan untuk melakukan simulasi terlebih dahulu. Jalankan di sudo apt-get install -s packagemana -smenunjukkan simulasi dan packageakan diganti dengan nama perangkat lunak yang sesuai.
@ vasa1 Ya, saya menyalahkan diri sendiri tentang hal ini. apt-get meminta [Y / n] juga, itu harusnya saya keluar ..
Karthik T
Saya hanya mendapatkan 1 paket terkait python lainnya (python-keybinder atau summat) sebagai "tidak perlu" Apakah Anda benar-benar menghapus cardapio-gnomepanelpaket itu?
gertvdijk
@ gertvdijk ya, apt-get remove carpadiobawa yang itu juga.
Karthik T
1
@ KarthikT Kemudian saya benar-benar bingung mengapa autoremovetidak bekerja untuk Anda. Entah Anda entah bagaimana menandai semua paket sebagai diinstal secara manual sekarang atau ada kesalahpahaman. Ini sangat sederhana: apt-get autoremovehanya menghapus semua paket bertanda yang diinstal secara otomatis tanpa alasan untuk memilikinya sekarang. Jika itu tidak berhasil untuk Anda, saya pikir Anda telah mengubah sesuatu pada sistem Anda yang tidak Anda ceritakan dalam pertanyaan Anda.
gertvdijk

Jawaban:

79

Pada dasarnya, Anda harus apt-get remove(atau apt-get purge) paket dan menjalankannya apt-get autoremovesetelah itu, untuk mengembalikan instalasi package-one.

Mari kita lihat keseluruhan proses:

  • sudo apt-get install package-one menginstal 50 dependensi dengan itu ditandai "otomatis" seperti juga dapat dilihat dari kutipan log dalam pertanyaan Anda

  • sudo apt-get purge package-one menghilangkan (pembersihan) hanya satu, tapi melakukan menjalankan ini!

    Semua tindakan pemasangan berikut (jika Anda menjalankannya) akan menghasilkan pesan informasi dengan paket tidak lagi diperlukan:

    The following packages were automatically installed and are no longer required:
      package-two package-three [...]
    Use 'apt-get autoremove' to remove them.
    

    Daftar ini pada dasarnya hanya daftar semua paket yang ditandai sebagai "otomatis" tanpa ketergantungan terbalik pada mereka. Dengan kata lain, tidak ada alasan bagi mereka untuk menginstal sejauh menyangkut manajemen paket.

    Catatan: Tidak diperlukan instalasi! Hanya untuk menunjukkan bahwa APT cerdas untuk memberi tahu Anda tentang paket-paket yang tidak dibutuhkan!

  • sudo apt-get autoremove --purge menghapus (membersihkan) ini

Informasi lebih lanjut

gertvdijk
sumber
2
Dalam OP ini telah menarik Unity dan semua teman-temannya. Saya ragu membersihkan cardapio akan menghapus Unity dll bahkan setelah autoremove.
@ vasa1 Mengapa? Paket-paket tersebut ditandai sebagai 'terinstal secara otomatis' (seperti dapat dilihat pada pertanyaan) dan jika tidak ada alasan untuk menginstalnya pada sistem, mereka akan disarankan untuk dihapus menggunakan autoremove.
gertvdijk
Ya, saya bertanya-tanya tentang "otomatis". Jika itu berfungsi untuk menunjukkan autoremoval itu bagus. OP seharusnya tidak memiliki masalah saat itu.
@gertvdijk tangkapan bagus oleh @ vasa1, mohon lihat edit saya. autoremovetidak membantu.
Karthik T
@ gertvdijk, untuk "Tindakan pemasangan selanjutnya", akankah sudo apt-get updatecukup?
19

Ketika Anda ingin menghapus paket dan dependensinya yang diinstal pada saat itu, Anda harus menggunakan:

sudo apt-get purge package
sudo apt-get --purge autoremove

tetapi untuk membatalkan apttindakan, Anda dapat menggunakan apt-undoskrip. Ini adalah skrip sederhana yang dapat membatalkan apttindakan yang dilakukan di Ubuntu. Perlu dicatat bahwa skrip ini hanya dapat berfungsi jika Anda menggunakannya alih-alih apt-getmenginstal / memutakhirkan / menghapus / membersihkan / menurunkan versi paket Anda.

Untuk menginstal apt-undodi Ubuntu, jalankan perintah berikut di terminal:

sudo add-apt-repository ppa:lkjoel/apt-undo
sudo apt-get update
sudo apt-get install apt-undo

pemakaian:

apt-undo install yourpackages
apt-undo remove yourpackages
apt-undo purge yourpackages
apt-undo upgrade
apt-undo dist-upgrade
apt-undo install yourpackages=old.version
apt-undo install yourpackages=new.version

Untuk membatalkan, aptitudetindakan di atas menjalankan perintah berikut di terminal:

apt-undo undo
Ramin
sumber
1
Terima kasih, saya menemukan ini, dan itu terdengar seperti apa yang diperintahkan dokter, sampai saya melihat peringatan bahwa saya perlu menggunakannya untuk menginstal, untuk dapat membatalkan ..
Karthik T
1
Tangkapan bagus. Sintaksnya sangat membingungkan. Dan saya benar-benar tidak suka menggunakan alternatif untuk aplikasi inti APT yang telah teruji. Masih memberi +1!
gertvdijk
7

Gunakan kekuatan Unix. Ambil baris file log yang Anda miliki, dan buat perintah yang akan membatalkan apa yang telah dilakukan apt. Sebagai contoh:

$ echo 'Install: libdbusmenu-qt2:amd64 (0.9.2-0ubuntu1, automatic), python-packagekit:amd64 (0.7.2-4ubuntu3, automatic), cups-pk-helper:amd64 (0.2.1.2-1ubuntu0.1, automatic),'|perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //'
libdbusmenu-qt2:amd64 python-packagekit:amd64 cups-pk-helper:amd64

Jadi Anda dapat menggunakan pembersihan ini semua paket yang Anda instal secara tidak sengaja, diberi baris yang sesuai dari file log Anda:

$ dpkg -P $(echo '(full log line here)' | perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //')

(Saya telah menggunakan perlalih-alih sedkarena sedmenggunakan jenis ekspresi reguler yang tidak mendukung kecocokan yang tidak serakah, yang merupakan cara termudah untuk membangun apa yang saya butuhkan)

Robie Basak
sumber
1
Skrip yang bagus, tetapi harus benar-benar hanya urutan perintah yang dapat diingat orang untuk mencapainya.
gertvdijk
Terima kasih, skrip yang mengintimidasi, tapi saya khawatir ini akan menjadi begini
Karthik T
1
Saya menggunakan kode yang sangat mirip untuk menyelesaikan masalah yang sangat mirip . Saya melakukannya dalam beberapa langkah hanya untuk lebih yakin tentang apa yang terjadi. Pertama saya menyalin blok teks yang relevan dari aptlog ke file baru dan kemudian menerapkan ini padanya: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Kemudian semua yang saya lakukan adalah menambahkan output dengan sudo apt-get removedan saya baik untuk pergi!
Insperatus
1

Setelah Anda menghapus satu paket, dan Anda dapat menghapusnya secara menyeluruh dengan menambahkan purge, untuk, apt-get remove --purge <package>, harus memberikan pesan bahwa paket perpustakaan itu menariknya di dipasang secara otomatis dan tidak lagi diperlukan, pada saat mana Anda dapat menjalankan apt-get autoremoveke Hapus mereka.

Ken Kinder
sumber
Terima kasih, tetapi autoremove terbukti tidak mencukupi dalam kasus ini. Silakan lihat edit saya.
Karthik T
1

Ikuti sudo apt-get purge packagenamedengan

sudo apt-get autoremove. 

Kecuali metapackage ini harus diurus.

Lihat juga faq di Bagaimana cara saya menghapus semua file Cardapio secara manual ? .

chaskes
sumber
Terima kasih, tetapi autoremove terbukti tidak mencukupi dalam kasus ini. Silakan lihat edit saya. Terima kasih atas tautan FAQ, sangat berguna!
Karthik T
1
Beberapa paket tersebut mungkin diperlukan oleh hal-hal lain dan tidak ditandai sebagai dapat autoremoved. Apakah Anda melihat petunjuk di tautan? Bagaimana itu?
chaskes
Instruksi pada tautan agak ortogonal dengan masalah inti, dan sebagaimana adanya, saya cenderung menginstal ulang sistem saya. terima kasih.
Karthik T
1
  1. Rekatkan daftar panjang paket yang tidak diinginkan dari log apt ke a new_file.txt
  2. Menjalankan perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Salin output dari perintah terakhir ke clipboard atau pipa itu di sana di tempat pertama .
  4. Jalankan sudo apt-get remove[rekatkan isi clipboard di sini]

Selesai.

Pada dasarnya kita perlu memformat daftar paket dari apt log menjadi sesuatu yang bisa dipahami oleh apt-get. Tanda kurung, kata-kata di antara, dan koma harus pergi sehingga di situlah perl datang untuk bermain. Ya, ada cara yang lebih baik (lebih efisien) - tapi saya sudah melakukan ini, mudah dimengerti, dan itu berhasil.

Insperatus
sumber
+1 untuk pengalaman dan penjelasan pribadi, tetapi seperti yang telah saya sebutkan sebelumnya, saya sudah mengatur ulang Live USB saya
Karthik T
1

Untuk membatalkan instalasi terakhir, Anda juga dapat menggunakan sesuatu seperti ini:

sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ")

Ini akan menangkap instal terakhir dari sejarah dan membersihkan semua paket yang diinstal di sini.

Anda dapat membuat fungsi yang disebut aptpurgelastinstall agar selalu ada (akan menambahkan kode ke ~ / .bashrc):

echo 'aptpurgelastinstall () { sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ") ; }' >> .bashrc

Sekarang Anda hanya perlu mengetikkan aptpurgelastinstall di shell untuk mengulang instalasi terakhir.

pengguna981297
sumber
Bereaksi terhadap komentar edit yang disarankan : "Memperbaiki pos saya sendiri (sebelum saya terdaftar)." Anda dapat meminta penggabungan akun Anda, lihat askubuntu.com/help/merging-accounts .
Melebius
0

Jika Anda baru saja menambahkan ppa dan ingin mengembalikan, Anda perlu melakukan langkah-langkah yang dijelaskan di bawah ini. Memahami ini bisa gagal, ketika Anda telah menginstal paket lain yang tidak ingin Anda hapus. Saya yakin ini bisa dilakukan dengan skrip. Secara pribadi saya pikir ini harus menjadi bagian dari apt, dan harus ada administrasi yang lebih baik dari paket mana yang diinstal karena dependensi dan yang diinstal berdasarkan permintaan pengguna.

1) menghapus ppa dari /etc/apt/sources.list Ingat saat Anda menambahkan ppa. Jika Anda beruntung, Anda tidak perlu tepat.

2) buat daftar apa yang harus diinstal ulang, dari saat Anda menginstal PPA: cat /var/log/dpkg.log | grep 'upgrade'

3) buat daftar apa yang harus dihapus, dari saat Anda menginstal PPA: cat /var/log/dpkg.log | grep 'instal'

4) hapus semua paket dari langkah 3: sudo apt-get remove {daftar paket dari langkah 3}

5) instal ulang semua paket dari langkah 2: sudo apt-get install --reinstall {daftar paket dari langkah 2}

6) Jika ada yang salah dan Anda tidak dapat menemukan solusi, masukkan kembali PPA dan instal ulang semua paket dari dua daftar.

VincentSC
sumber
0

Saya tahu ini pertanyaan yang cukup lama tapi saya datang ke sini mencari bantuan dan mungkin saya bisa membantu seseorang. Saya memiliki situasi yang mirip dengan @ Karthik-T setelah menginstal unity8-desktop-session-mir. Saya tahu ini yang besar. Itu menarik 233 paket dengannya.

Menggunakan autoremovesaya bisa dihapus hanya 34 dari mereka. Intinya adalah bahwa selama unity8-desktop-session-mirinstalasi, ia menghapus dua paket ( python3-aptdaemon.pkcompatdan evolution-data-server-online-accounts). Itu dinyatakan dalam /var/log/apt/history.log, setelah Installbagian.

Untuk benar-benar membatalkan instalasi Unity 8 saya mengeluarkan yang berikut:

  1. sudo apt-get purge unity8-desktop-session-mir
  2. sudo apt-get --purge autoremove
  3. sudo apt-get install python3-aptdaemon.pkcompat evolution-data-server-online-accounts (Itu menghapus 8 paket yang terkait dengan Unity 8)
  4. sudo apt-get --purge autoremove

Ini tidak akan menghapus sepenuhnya semua yang Anda instal sebelumnya, tetapi dalam beberapa kasus cukup baik.

PS: mungkin autoremovepada langkah dua tidak perlu, karena saya dikeluarkan lagi pada langkah empat.


sumber
0

Secara teknis "menghapus" atau "autoremove" operasi tidak "dibatalkan" meskipun mereka dapat dibuat untuk melakukan pekerjaan dengan cukup baik sebagian besar kali.

Secara default, apt-get akan meninggalkan paket, kecuali Anda tentukan -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

Lebih dapat diandalkan untuk melihat apt history.logdan menghapus semua paket yang diinstal. Saya telah membuat skrip berbasis simpul kecil untuk memudahkan proses:

https://github.com/rolfen/apt-history

Juga, berikut ini adalah pendekatan lain yang lebih manual untuk perubahan "memutar kembali":

https://unix.stackexchange.com/a/236711

Rolf
sumber