Czy można cofnąć polecenie instalacji apt-get?

67

Zainstalowałem Carpadio na mojej instalacji Xubuntu (Live USB), która następnie ściągnęła ponad 50 pakietów z, jak sądzę, strony Ubuntu repozytorium. Teraz chciałbym to cofnąć. Jednak przez całe moje polowanie nie mogę znaleźć nic bardziej użytecznego niż polecenie Jak odwrócić sudo apt get install , co sugeruje apt-get purge. Nie jest to przydatne, ponieważ wystarczy usunąć 2 pakiety (carpadio i carpadio-gnomepanel).

/var/log/apt/history.logzawiera listę wszystkich pakietów zainstalowanych wraz z tym poleceniem. Zastanawiałem się więc, czy istnieje jakiś prosty sposób na usunięcie ich wszystkich ? W przeciwnym razie mogę po prostu zainstalować ponownie, to i tak była nowa instalacja, ale jestem ciekawy.

Mała próbka dziennika historii (1 / 5-1 / 10 całej listy)

Wiersz poleceń: apt-get install cardapio-gnomepanel
Zainstaluj: libdbusmenu-qt2: amd64 (0.9.2-0ubuntu1, automatyczny), python-packagekit: amd64 (0.7.2-4ubuntu3, automatyczny), cup-pk-helper: amd64 (0.2.1.2-1ubuntu0.1, automatyczny) , geoclue: amd64 (0.12.0-1ubuntu12, automatyczny), jedność: amd64 (5.18.0-0ubuntu1, automatyczny), drukarki wskaźnikowe: amd64 (0.1.6-0ubuntu1, automatyczny), libevolution: amd64 (3.2.3- 0ubuntu6, automatyczny), libqt4-deklaratywny: amd64 (4.8.1-0ubuntu4.3, automatyczny), libmtp9: amd64 (1.1.3-1ubuntu0.1, automatyczny), tracker-miner-fs: amd64 (0.14.0-2ubuntu1 , automatyczny), gir1.2-rb-3.0: amd64 (2.96-0ubuntu4.2, automatyczny), python-aptdaemon.pkcompat: amd64 (0,43 + bzr805-0ubuntu7, automatyczny), gnome-media: amd64 (3.4.0- 0ubuntu3.1, automatyczny), metacity: amd64 (2.34.1-1ubuntu11, automatyczny), nautilus: amd64 (3.4.2-0ubuntu6, automatyczny), libcompizconfig0: amd64 (0.9.7.0 ~ bzr428-0ubuntu6, automatyczny), compiz- wtyczki-domyślne:amd64 (0.9.7.12-0ubuntu1, automatyczny), libunistring0: amd64 (0.9.3-5, automatyczny), libebackend-1.2-1: amd64 (3.2.3-0ubuntu7, automatyczny), ubuntu-docs: amd64 (12.04.6 , automatyczny), python-mako: amd64 (0.5.0-1, automatyczny),

Wszystkim, którzy zasugerowali autoremove: nie jestem pewien dlaczego, ale dostałem tylko 1 inny pakiet związany z pythonem (python-keybinder lub coś takiego) jako „niepotrzebny” i to wszystko, co autorove mógł usunąć.

Pomiędzy instalacją a odinstalowaniem instalowano tylko poważną zmianę xubuntu-restricted-extras.

Karthik T.
źródło
4
W tym przypadku jest trochę za późno, ale następnym razem, gdy chcesz coś zainstalować, rozważ najpierw wykonanie symulacji. Uruchom sudo apt-get install -s packagetam, gdzie -soznacza symulację i packagezostanie zastąpiona nazwą odpowiedniego oprogramowania.
@ vasa1 Tak, biję się z tego powodu. apt-get pyta również [T / n], że powinienem był wyjść.
Karthik T
Mam tylko 1 inny Pythona związanych pakiet (python-keybinder lub summat) jako „zbędne” Czy rzeczywiście usunąć cardapio-gnomepanelpakiet?
gertvdijk
@gertvdijk tak, też to apt-get remove carpadiozabrałem.
Karthik T
1
@KarthikT Więc jestem całkowicie zagubiony, dlaczego autoremovenie pracuje dla ciebie. Albo jakoś oznaczyłeś teraz wszystkie pakiety jako zainstalowane ręcznie, albo istnieje oczywiste nieporozumienie. To bardzo proste: apt-get autoremovepo prostu usuwa wszystkie automatycznie zainstalowane oznaczone pakiety bez powodu, aby je teraz mieć. Jeśli to nie działa, myślę, że zmieniłeś coś w swoim systemie, o czym nie powiedziałeś w swoim pytaniu.
gertvdijk

Odpowiedzi:

79

Zasadniczo musisz zarówno apt-get remove(lub apt-get purge) pakiet, a następnie uruchomić go apt-get autoremove, aby przywrócić instalację package-one.

Spójrzmy na cały proces:

  • sudo apt-get install package-one instaluje 50 zależności z oznaczeniem „automatyczny”, co można również zobaczyć w fragmencie dziennika w swoim pytaniu

  • sudo apt-get purge package-one Wyrzuca (czystki) tylko jeden, ale zrobić uruchomić to!

    Wszystkie poniższe działania instalacyjne (jeśli je uruchomisz) przyniosą komunikat informacyjny z niepotrzebnymi już pakietami:

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

    Ta lista jest w zasadzie tylko listą wszystkich pakietów oznaczonych jako „automatyczne” bez odwrotnej zależności od nich. Innymi słowy, nie ma powodu, aby instalować je w zakresie zarządzania pakietami.

    Uwaga: instalacja nie jest wymagana! To tylko wykazanie, że APT jest mądry, aby powiedzieć ci o twoich niepotrzebnych pakietach!

  • sudo apt-get autoremove --purge usuwa je (czyści)

Więcej informacji

gertvdijk
źródło
2
W tym PO wciągnął Jedność i wszystkich jej przyjaciół. Wątpię, że wyczyszczenie cardapio usunie Unity itp. Nawet po autorove.
@ vasa1 Dlaczego? Pakiety są oznaczone jako „automatycznie zainstalowane” (jak widać w pytaniu) i jeśli nie można znaleźć żadnego powodu dla tych, które mają zostać zainstalowane w systemie, zostaną one zaproponowane do usunięcia autoremove.
gertvdijk
Tak, zastanawiałem się nad „automatycznym”. Jeśli to służy do wskazania autoroval, to dobrze. OP nie powinien wtedy mieć problemów.
@gertvdijk good catch by @ vasa1, proszę zobaczyć moją edycję. autoremovenie pomogło.
Karthik T
@gertvdijk dla „Kolejnych działań instalacyjnych” byłoby sudo apt-get updatewystarczające?
19

Jeśli chcesz usunąć pakiet i jego zależności, które zostały zainstalowane w tym czasie, powinieneś użyć:

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

ale aby cofnąć aptakcje, możesz użyć apt-undoskryptu. Jest to prosty skrypt, który może cofnąć aptczynności wykonywane w systemie Ubuntu. Należy zauważyć, że ten skrypt może działać tylko wtedy, gdy użyjesz go zamiast apt-getinstalować / aktualizować / usuwać / czyścić / obniżać pakiety.

Aby zainstalować apt-undow Ubuntu, uruchom następujące polecenia w terminalu:

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

stosowanie:

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

Aby cofnąć, powyższe aptitudeakcje uruchamiają następujące polecenia w terminalu:

apt-undo undo
Ramin
źródło
1
Dzięki, natknąłem się na to i brzmiało to dokładnie tak, jak zamówił lekarz, dopóki nie zobaczyłem zastrzeżenia, że ​​muszę go użyć do zainstalowania, aby móc cofnąć ..
Karthik T
1
Dobry chwyt. Jednak bardzo myląca składnia. I naprawdę nie lubię używać alternatyw dla dobrze przetestowanej podstawowej aplikacji APT. Nadal +1!
gertvdijk
7

Wykorzystaj moc Uniksa. Weź linię pliku dziennika, którą masz, i stwórz polecenie, które cofnie to, co zrobił apt. Na przykład:

$ 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

Abyś mógł użyć tego usuwania wszystkich przypadkowo zainstalowanych pakietów, biorąc pod uwagę odpowiedni wiersz z pliku dziennika:

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

(Użyłem perlzamiast tego, sedponieważ sedużywa rodzaju wyrażeń regularnych, które nie obsługują niepochodnych dopasowań, co było najłatwiejszym sposobem konstruowania tego, czego potrzebowałem)

Robie Basak
źródło
1
Fajny skrypt, ale tak naprawdę powinna to być sekwencja poleceń, które ludzie mogą zapamiętać, aby go wykonać.
gertvdijk
Dzięki, zastraszający scenariusz, ale bałem się, że do tego dojdzie
Karthik T
1
Użyłem bardzo podobnego kodu, aby rozwiązać mój bardzo podobny problem . Zrobiłem to w kilku krokach, aby być bardziej pewnym tego, co się dzieje. Najpierw skopiowałem odpowiedni blok tekstu z aptdziennika do nowego pliku, a następnie zastosowałem go do tego: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Potem wszystko, co zrobiłem, to wstawienie tego wyjścia sudo apt-get removei byłem gotowy do pracy!
Insperatus
1

Po usunięciu jeden pakiet, a można go usunąć dokładnie dodając --purge, bo apt-get remove --purge <package>powinno dać ci wiadomość, że pakiety biblioteczne to wciągnięta zostały zainstalowane automatycznie i nie są już konieczne, w tym momencie można uruchomić apt-get autoremovedo Usuń ich.

Ken Kinder
źródło
Dzięki, ale autorove okazał się w tym przypadku niewystarczający. Proszę zobaczyć moją edycję.
Karthik T
1

Postępuj zgodnie sudo apt-get purge packagenamez

sudo apt-get autoremove. 

O ile nie jest to metapakiet, powinno to załatwić.

Zobacz też często zadawane pytania na stronie Jak ręcznie usunąć wszystkie pliki Cardapio? .

kolby
źródło
Dzięki, ale autorove okazał się w tym przypadku niewystarczający. Proszę zobaczyć moją edycję. Dziękujemy za link FAQ, bardzo przydatny!
Karthik T
1
Niektóre z tych pakietów mogą być potrzebne przez inne rzeczy i nie są oznaczone jako możliwe do autoroved. Czy spojrzałeś na instrukcje pod linkiem? Jak tam
chaskes,
Instrukcje dotyczące linku są raczej ortogonalne w stosunku do podstawowego problemu i obecnie skłaniam się do ponownej instalacji mojego systemu. w każdym razie dzięki.
Karthik T
1
  1. Wklej długą listę niechcianych pakietów z dziennika apt do new_file.txt
  2. Wykonać perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Skopiuj dane wyjściowe ostatniego polecenia do schowka lub umieść je tam w pierwszej kolejności .
  4. Wykonaj sudo apt-get remove[wklej tutaj zawartość schowka]

Gotowy.

Zasadniczo musimy sformatować listę pakietów z logu apt w coś, co apt-get może zrozumieć. Nawiasy, słowa pomiędzy nimi i przecinki muszą iść, więc w tym miejscu pojawia się perl. Tak, istnieją lepsze (bardziej wydajne) sposoby - ale zrobiłem to, jest łatwy do zrozumienia i działa.

Insperatus
źródło
+1 za osobiste wrażenia i wyjaśnienia, ale jak wspomniałem wcześniej, zresetowałem już moje Live USB
Karthik T
1

Aby cofnąć ostatnią instalację apt, możesz również użyć czegoś takiego:

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

Spowoduje to przechwycenie ostatniej instalacji apt z historii i usunięcie wszystkich zainstalowanych tutaj pakietów.

Możesz utworzyć funkcję o nazwie aptpurgelastinstall, aby mieć ją zawsze pod ręką (doda kod do ~ / .bashrc):

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

Teraz wystarczy wpisać w powłoce aptpurgelastinstall, aby ponownie wykonać ostatnią instalację.

użytkownik981297
źródło
W odpowiedzi na komentarz do sugerowanej edycji : „Poprawiłem własny post (zanim zostałem zarejestrowany)”. Możesz poprosić o połączenie swoich kont, patrz askubuntu.com/help/merging-accounts .
Melebius
0

Jeśli właśnie dodałeś ppa i chcesz przywrócić, musisz wykonać czynności opisane poniżej. Zrozum, że to może się nie powieść, gdy zainstalujesz inne pakiety, których nie chcesz odinstalować. Jestem pewien, że można to zrobić za pomocą skryptu. Osobiście uważam, że powinno to być częścią apt, i powinna istnieć lepsza administracja, które pakiety są instalowane z powodu zależności, a które instalowane są na żądanie użytkownika.

1) usuń ppa z /etc/apt/sources.list Pamiętaj, kiedy dodałeś ppa. Jeśli masz szczęście, nie musisz być precyzyjny.

2) sporządzić listę elementów do ponownej instalacji, od momentu zainstalowania PPA: cat /var/log/dpkg.log | grep 'upgrade'

3) Zrób listę rzeczy do usunięcia, od momentu zainstalowania PPA: cat /var/log/dpkg.log | grep 'install'

4) usuń wszystkie pakiety z kroku 3: sudo apt-get remove {lista pakietów z kroku 3}

5) zainstaluj ponownie wszystkie pakiety z kroku 2: sudo apt-get install --reinstall {lista pakietów z kroku 2}

6) Jeśli coś poszło nie tak i nie możesz znaleźć rozwiązania, odłóż PPA i zainstaluj ponownie wszystkie pakiety z dwóch list.

VincentSC
źródło
0

Wiem, że to dość stare pytanie, ale przyszedłem tutaj, szukając pomocy i może mogę komuś pomóc. Po instalacji miałem sytuację podobną do tej w @ Karthik-T unity8-desktop-session-mir. Wiem, że to duży. Pociągnął za sobą 233 paczki.

Używając autoremove, usuwam tylko 34 z nich. Chodzi o to, że podczas unity8-desktop-session-mirinstalacji usunął dwa pakiety ( python3-aptdaemon.pkcompati evolution-data-server-online-accounts). Jest napisane w /var/log/apt/history.log, po Installczęści.

Aby całkowicie cofnąć instalację Unity 8, wydałem następujące informacje:

  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 (usunęło 8 pakietów związanych z Unity 8)
  4. sudo apt-get --purge autoremove

Nie usunie to absolutnie wszystkiego, co wcześniej zainstalowałeś, ale w niektórych przypadkach jest wystarczająco dobre.

PS: być może autoremovedrugi krok nie jest konieczny, ponieważ wydałem ponownie w czwartym kroku.


źródło
0

Technicznie operacje „usuń” lub „autorove” nie są „cofane”, chociaż można je wykonać tak, aby wykonały zadanie wystarczająco dobrze przez większość czasu.

Domyślnie apt-get pozostawia pakiety, o ile nie określisz tego -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

Bardziej niezawodne jest spojrzenie na apt history.logi odinstalowanie wszystkich zainstalowanych pakietów. Utworzyłem mały skrypt oparty na węzłach, aby ułatwić ten proces:

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

Oto kolejne, bardziej ręczne podejście do „wycofywania” zmian:

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

Rolf
źródło