Usunięcie nieużywanych zależności za pomocą programu „autorove”

25

Myślałem, że uruchomienie apt-get autoremovebez następującego argumentu usuwa wszystkie nieużywane zależności pozostawione w systemie, podczas gdy uruchamianie apt-get autoremove xxxusuwa xxx i jego nieużywane zależności.

Jednak odkryłem inaczej. Uruchomienie apt-get autoremove xxxnie tylko usuwa xxx i jego nieużywane zależności, ale także usuwa wszystkie inne nieużywane zależności.

Następnie spróbowałem uruchomić apt-get remove --auto-remove xxx, sądząc, że spowoduje to usunięcie tylko xxx i jego nieużywanych zależności. Ku mojemu zaskoczeniu usunęło to także xxx, jego nieużywane zależności i wszystkie inne nieużywane zależności.

To prowadzi mnie do dwóch powiązanych pytań.

(1) Czy takie jest zamierzone zachowanie poleceń?

(2) Czy istnieje prosty sposób na usunięcie xxx i jego nieużywanych zależności bez usuwania innych nieużywanych zależności?

(Wygląda na to, że aptitude removezachowuje się podobnie.)

zrajm
źródło

Odpowiedzi:

21

Przeglądając plik cmdline/apt-get.ccze źródłowego archiwum na stronie http://packages.ubuntu.com/source/maverick/apt , widzę, że --auto-removejest to argument, który umożliwia APT::Get::AutomaticRemoveustawienie.

Polecenia autoremovei removeoba wywołują funkcję DoInstall.

Komenda „autorove” APT::Get::AutomaticRemoveteż się ustawia i dlatego działa tak samo jak --auto-remove.

Patrząc na DoAutomaticRemovefunkcję, wyraźnie widać, że włączenie tego APT::Get::AutomaticRemoveustawienia ( --auto-removei autoremoverobi to) powoduje, że Apt zapętla wszystkie zainstalowane pakiety i oznacza nieużywane pakiety do usunięcia.

Od main():

CommandLine::Args Args[] = {
   // ... stripped to save space
   {0,"auto-remove","APT::Get::AutomaticRemove",0},
   // ...
}
CommandLine::Dispatch Cmds[] = { // ...
                                {"remove",&DoInstall},
                                {"purge",&DoInstall},
                                {"autoremove",&DoInstall},
                                // ...
}
// ...
// Parse the command line and initialize the package library
CommandLine CmdL(Args,_config);

Od DoInstall():

 unsigned short fallback = MOD_INSTALL;
   if (strcasecmp(CmdL.FileList[0],"remove") == 0)
      fallback = MOD_REMOVE;
   else if (strcasecmp(CmdL.FileList[0], "purge") == 0)
   {
      _config->Set("APT::Get::Purge", true);
      fallback = MOD_REMOVE;
   }
   else if (strcasecmp(CmdL.FileList[0], "autoremove") == 0)
   {
      _config->Set("APT::Get::AutomaticRemove", "true");
      fallback = MOD_REMOVE;
   }

Z funkcji DoAutomaticRemove:

   bool doAutoRemove = _config->FindB("APT::Get::AutomaticRemove", false);
   // ...
   // look over the cache to see what can be removed
   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) {
       if (doAutoRemove) {
       if(Pkg.CurrentVer() != 0 && 
          Pkg->CurrentState != pkgCache::State::ConfigFiles)
          Cache->MarkDelete(Pkg, purgePkgs);
       else
          Cache->MarkKeep(Pkg, false, false);
   }
   }

Nie mogę powiedzieć, czy jest to zamierzone, czy nie, możesz wypełnić błąd / zadać pytanie na launchpad.net .


W tej chwili nie można wykluczyć pakietów z usunięcia przez apt-get autoremove. Jeśli chcesz zachować pakiety, uruchom apt-get -s autoremove, skopiuj pakiety z listy i usuń pakiety z listy, którą chcesz zachować. Na koniec usuń te pakiety: sudo apt-get purge [packages-to-be-removed](purge usuwa również pliki konfiguracyjne, jeśli takie istnieją)

Lekensteyn
źródło
Co zatem zalecamy usunąć tylko xxx i jego nieużywane zależności? Proszę, podaj to w odpowiedzi na moją naukę, dzięki!
1
Nie można wykluczyć pakietów z autorove, jeśli chcesz, aby pakiety nie były automatycznie usuwane, usuń je za pomocą apt-get purgelub apt-get remove.
Lekensteyn