Усунення невикористаних залежностей за допомогою "авторемонту"


25

Я думав, що запуск apt-get autoremoveбез будь-якого наступного аргументу видаляє всі невикористані залежності, залишені в системі, а під час запуску apt-get autoremove xxxвидаляє xxx та його невикористані залежності.

Однак я виявив інакше. Запуск apt-get autoremove xxxне тільки видаляє xxx та його невикористані залежності, але й видаляє всі інші невикористані залежності.

Потім я спробував запустити apt-get remove --auto-remove xxx, думаючи, що це видалить лише xxx та його невикористані залежності. На мій подив, це також вилучило ххх, його невикористані залежності та всі інші невикористані залежності.

Це призводить мене до двох суміжних питань.

(1) Це цільова поведінка команд?

(2) Чи існує простий спосіб видалити xxx та його невикористані залежності, не видаляючи інші невикористані залежності?

(Здається, що aptitude removeтакож поводиться аналогічно.)

Відповіді:


21

Переглядаючи файл cmdline/apt-get.ccіз вихідного tarball за адресою http://packages.ubuntu.com/source/maverick/apt , я можу побачити, що --auto-removeце аргумент, який дозволяє APT::Get::AutomaticRemoveналаштувати.

Команди autoremoveі removeобидва виклики функції DoInstall.

Команда "autoremove" задається APT::Get::AutomaticRemoveтакож, і вона робить те саме, що і --auto-remove.

Поглянувши на DoAutomaticRemoveфункцію, чітко видно, що ввімкнення цього APT::Get::AutomaticRemoveпараметра ( --auto-removeі autoremoveце робить) викликає цикл Apt через усі встановлені пакети та відмічає невикористані пакети для видалення.

Від 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);

Від 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;
   }

Від функції 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);
   }
   }

Я не можу говорити, призначено це чи ні, ви можете заповнити помилку / задати питання на startpad.net .


Наразі неможливо виключити пакети зі видалення користувачем apt-get autoremove. Якщо ви хочете зберегти пакунки, запустіть apt-get -s autoremove, скопіюйте пакунки зі списку та видаліть пакунки зі списку, який ви хочете зберегти. Нарешті, видаліть ці пакунки: sudo apt-get purge [packages-to-be-removed](чистка також видаляє файли конфігурації, якщо такі є)


Що ви рекомендуєте видалити лише xxx та його невикористані залежності? Будь ласка, включіть це у відповідь за моє навчання, дякую!

1
Ви не можете виключати пакети з автоматичного пересування, якщо ви хочете не допускати автоматичного видалення пакунків, видаліть їх за допомогою apt-get purgeабо apt-get remove.
Лекенштейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.