Удаление неиспользуемых зависимостей с помощью «автоудаления»


25

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

Однако я обнаружил, что иначе. Запуск apt-get autoremove xxxне только удаляет xxx и его неиспользуемые зависимости, но также удаляет все остальные неиспользуемые зависимости.

Затем я попытался запустить apt-get remove --auto-remove xxx, думая, что это удалит только xxx и его неиспользуемые зависимости. К моему удивлению, это также удалило xxx, его неиспользуемые зависимости и все другие неиспользуемые зависимости.

Это приводит меня к двум связанным вопросам.

(1) Это предполагаемое поведение команд?

(2) Есть ли простой способ удалить xxx и его неиспользуемые зависимости, не удаляя другие неиспользуемые зависимости?

(Похоже, что aptitude removeтакже ведет себя аналогичным образом.)

Ответы:


21

Глядя в файл cmdline/apt-get.ccиз исходного архива по адресу 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);
   }
   }

Я не могу сказать, предназначен ли он или нет, вы можете заполнить ошибку / задать вопрос на launchpad.net .


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


Что вы рекомендуете удалить только ххх и его неиспользуемые зависимости? Пожалуйста, включите это в ответ для моего обучения, спасибо!

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