Rimozione di dipendenze non utilizzate mediante "autoremove"


25

Ho pensato che correre apt-get autoremovesenza alcun argomento seguente rimuovesse tutte le dipendenze inutilizzate rimaste sul sistema, mentre correre apt-get autoremove xxxrimuove xxx e le sue dipendenze inutilizzate.

Tuttavia ho scoperto il contrario. L'esecuzione apt-get autoremove xxxnon solo rimuove xxx e le sue dipendenze inutilizzate, ma rimuove anche tutte le altre dipendenze inutilizzate.

Ho quindi provato a correre apt-get remove --auto-remove xxx, pensando che questo avrebbe rimosso solo xxx e le sue dipendenze inutilizzate. Con mia sorpresa, questo ha anche rimosso xxx, le sue dipendenze inutilizzate e tutte le altre dipendenze inutilizzate.

Questo mi porta a due domande correlate.

(1) È questo il comportamento previsto dei comandi?

(2) Esiste un modo semplice per rimuovere xxx e le sue dipendenze inutilizzate senza rimuovere altre dipendenze inutilizzate?

(Sembra che aptitude removesi comporti anche in modo simile.)

Risposte:


21

Guardando il file cmdline/apt-get.ccdal tarball di origine su http://packages.ubuntu.com/source/maverick/apt , posso vedere che --auto-removeè un argomento che abilita l' APT::Get::AutomaticRemoveimpostazione.

I comandi autoremoveed removeentrambi chiama la funzione DoInstall.

Anche il comando "autoremove" imposta APT::Get::AutomaticRemovee quindi fa la stessa cosa di --auto-remove.

Osservando la DoAutomaticRemovefunzione, è chiaramente visibile che abilitando l' APT::Get::AutomaticRemoveimpostazione ( --auto-removee facendo autoremoveciò) si verifica il loop Apt attraverso tutti i pacchetti installati e contrassegna i pacchetti non utilizzati per l'eliminazione.

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

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

Dalla funzione 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);
   }
   }

Non posso dire se è previsto o no, potresti riempire un bug / fare una domanda su launchpad.net .


Al momento, non è possibile escludere i pacchetti dalla cancellazione entro apt-get autoremove. Se si desidera conservare i pacchetti, eseguire apt-get -s autoremove, copiare i pacchetti dall'elenco e rimuovere i pacchetti dall'elenco che si desidera conservare. Infine, rimuovi quei pacchetti: sudo apt-get purge [packages-to-be-removed](l'eliminazione rimuove anche i file di configurazione, se presenti)


Cosa consiglieresti di rimuovere solo xxx e le sue dipendenze inutilizzate? Per favore, includilo nella risposta per il mio apprendimento, grazie!

1
Non è possibile escludere i pacchetti da autoremove, se si desidera impedire che i pacchetti vengano rimossi automaticamente, rimuoverli con apt-get purgeo apt-get remove.
Lekensteyn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.