it-swarm.com.de

Entfernung nicht verwendeter Abhängigkeiten mit "autoremove"

Ich dachte, apt-get autoremove ohne das folgende Argument auszuführen, entfernt alle nicht verwendeten Abhängigkeiten, die auf dem System verbleiben, während apt-get autoremove xxx xxx und seine nicht verwendeten Abhängigkeiten entfernt.

Jedoch habe ich etwas anderes entdeckt. Wenn Sie apt-get autoremove xxx ausführen, werden nicht nur xxx und die nicht verwendeten Abhängigkeiten entfernt, sondern auch alle anderen nicht verwendeten Abhängigkeiten.

Ich habe dann versucht, apt-get remove --auto-remove xxx auszuführen, wobei ich dachte, dass dies nur xxx und seine nicht verwendeten Abhängigkeiten entfernen würde. Zu meiner Überraschung entfernte dies auch xxx, seine nicht verwendeten Abhängigkeiten und alle anderen nicht verwendeten Abhängigkeiten.

Dies führt mich zu zwei verwandten Fragen.

(1) Ist dies das beabsichtigte Verhalten der Befehle?

(2) Gibt es eine einfache Möglichkeit, xxx und seine nicht verwendeten Abhängigkeiten zu entfernen, ohne andere nicht verwendete Abhängigkeiten zu entfernen?

(Anscheinend verhält sich aptitude remove auch ähnlich.)

25
user7182

In der Datei cmdline/apt-get.cc aus dem Quell-Tarball unter http://packages.ubuntu.com/source/maverick/apt kann ich sehen, dass --auto-remove ein Argument ist, das aktiviert die Einstellung APT::Get::AutomaticRemove.

Die Befehle autoremove und remove rufen beide die Funktion DoInstall auf.

Der Befehl "autoremove" setzt auch APT::Get::AutomaticRemove und macht daher das Gleiche wie --auto-remove.

Wenn Sie in der Funktion DoAutomaticRemove nachsehen, ist deutlich zu erkennen, dass das Aktivieren der Einstellung APT::Get::AutomaticRemove (--auto-remove und autoremove) eine Apt-Schleife durch alle installierten Pakete verursacht und nicht verwendete Pakete zum Löschen markiert .

Von 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);

Von 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;
   }

Von der Funktion 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);
   }
   }

Ich kann nicht sagen, ob es beabsichtigt ist oder nicht, du könntest einen Fehler /ask eine Frage at launchpad.net ausfüllen.


Momentan ist es nicht möglich, Pakete durch apt-get autoremove vom Löschen auszuschließen. Wenn Sie Pakete behalten möchten, führen Sie apt-get -s autoremove aus, kopieren Sie die Pakete aus der Liste und entfernen Sie die Pakete aus der Liste, die Sie behalten möchten. Schließlich entfernen Sie diese Pakete: Sudo apt-get purge [packages-to-be-removed] (Bereinigen entfernt auch die Konfigurationsdateien, falls vorhanden)

21
Lekensteyn