使用“autoremove”删除未使用的依赖项

使用“autoremove”删除未使用的依赖项

我认为运行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行为方式也类似。)

答案1

cmdline/apt-get.cc查看源码包中的文件http://packages.ubuntu.com/source/maverick/apt,我明白这--auto-remove是一个启用该设置的参数APT::Get::AutomaticRemove

命令autoremoveremove两者都调用该函数DoInstall

命令“autoremove”APT::Get::AutomaticRemove也设置了,因此它做的事情与 相同--auto-remove

查看该DoAutomaticRemove函数,可以清楚地看到,启用该APT::Get::AutomaticRemove设置(--auto-removeautoremove执行此操作)会导致 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]清除也会删除配置文件(如果有))

相关内容