「autoremove」を使用した未使用の依存関係の削除


25

apt-get autoremove次の引数なしで実行apt-get autoremove xxxすると、システムに残っているすべての未使用の依存関係が削除され、実行中にxxxとその未使用の依存関係が削除されると考えました。

しかし、私は別の方法で発見しました。実行apt-get autoremove xxxすると、xxxとその未使用の依存関係が削除されるだけでなく、他のすべての未使用の依存関係も削除されます。

次にapt-get remove --auto-remove xxx、xxxとその未使用の依存関係のみを削除すると考えて、実行してみました。驚いたことに、これにより、xxx、その未使用の依存関係、および他のすべての未使用の依存関係も削除されました。

これは、2つの関連する質問につながります。

(1)これはコマンドの意図された動作ですか?

(2)xxxとその未使用の依存関係を、他の未使用の依存関係を削除せずに削除する簡単な方法はありますか?

aptitude remove同様の動作をするようです。)

回答:


21

http://packages.ubuntu.com/source/maverick/aptにcmdline/apt-get.ccあるソースtarballのファイルを見ると、これが設定を有効にする引数であることがわかります。--auto-removeAPT::Get::AutomaticRemove

コマンドautoremoveremove両方が関数を呼び出しますDoInstall

コマンド「autoremove」も設定するAPT::Get::AutomaticRemoveため、と同じことを行い--auto-removeます。

見るとDoAutomaticRemove機能、それが有効にすることをはっきりと見えるのですAPT::Get::AutomaticRemove(設定する--auto-removeと、autoremoveこれを行います)、すべてのインストールされたパッケージやマーク削除のために使用されていないパッケージを経由アプトループの原因となります。

から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]もしあればパージも構成ファイルを削除します)


では、xxxとその未使用の依存関係のみを削除することをお勧めしますか?それを私の学習の答えに含めてください、ありがとう!

1
パッケージが自動削除されないようにするには、パッケージを自動削除から除外できません。apt-get purgeまたはで削除しますapt-get remove
レーケンシュタイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.