Loại bỏ các phụ thuộc không được sử dụng bằng cách sử dụng Autoremove


25

Tôi nghĩ rằng chạy apt-get autoremovemà không có bất kỳ đối số sau đây sẽ loại bỏ tất cả các phụ thuộc không sử dụng còn lại trên hệ thống, trong khi chạy apt-get autoremove xxxloại bỏ xxx và các phụ thuộc không sử dụng của nó.

Tuy nhiên tôi phát hiện ra khác. Chạy apt-get autoremove xxxkhông chỉ loại bỏ xxx và các phụ thuộc không sử dụng của nó, nó cũng loại bỏ tất cả các phụ thuộc không sử dụng khác.

Sau đó tôi đã thử chạy apt-get remove --auto-remove xxx, nghĩ rằng điều này sẽ chỉ loại bỏ xxx và các phụ thuộc không sử dụng của nó. Thật ngạc nhiên, điều này cũng loại bỏ xxx, các phụ thuộc không sử dụng và tất cả các phụ thuộc không sử dụng khác.

Điều này dẫn tôi đến hai câu hỏi liên quan.

(1) Đây có phải là hành vi dự định của các lệnh?

(2) Có cách nào dễ dàng để loại bỏ xxx và các phụ thuộc không sử dụng của nó mà không loại bỏ các phụ thuộc không sử dụng khác không?

(Có vẻ như aptitude removecũng hành xử theo cách tương tự.)

Câu trả lời:


21

Nhìn vào tệp cmdline/apt-get.cctừ tarball nguồn tại http://packages.ubfox.com/source/maverick/apt , tôi có thể thấy đó --auto-removelà một đối số cho phép APT::Get::AutomaticRemovecài đặt.

Các lệnh autoremoveremovecả hai gọi hàm DoInstall.

Lệnh "autoremove" APT::Get::AutomaticRemovecũng thiết lập và do đó nó cũng giống như vậy --auto-remove.

Nhìn vào DoAutomaticRemovehàm, có thể thấy rõ rằng việc bật APT::Get::AutomaticRemovecài đặt ( --auto-removeautoremovethực hiện điều này) sẽ khiến Apt lặp qua tất cả các gói đã cài đặt và đánh dấu các gói không sử dụng để xóa.

Từ 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);

Từ 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;
   }

Từ chức năng 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);
   }
   }

Tôi không thể nói liệu nó có ý định hay không, bạn có thể điền vào một lỗi / đặt câu hỏi tại launchpad.net .


Hiện tại, không thể loại trừ các gói khỏi bị xóa bởi apt-get autoremove. Nếu bạn muốn giữ các gói, hãy chạy apt-get -s autoremove, sao chép các gói khỏi danh sách và xóa các gói khỏi danh sách mà bạn muốn giữ. Cuối cùng, loại bỏ các gói đó: sudo apt-get purge [packages-to-be-removed](thanh lọc cũng loại bỏ các tệp cấu hình, nếu có)


Bạn khuyên gì để loại bỏ chỉ xxx và các phụ thuộc không sử dụng của nó sau đó? Vui lòng bao gồm điều đó trong câu trả lời cho việc học của tôi, cảm ơn!

1
Bạn không thể loại trừ các gói khỏi autoremove, nếu bạn muốn giữ các gói không bị tự động xóa, hãy xóa chúng bằng apt-get purgehoặc apt-get remove.
Lekensteyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.