การเอาการอ้างอิงที่ไม่ได้ใช้ออกโดยใช้“ autoremove”


25

ฉันคิดว่าการรัน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ทำงานในลักษณะเดียวกัน)

คำตอบ:


21

เมื่อดูในไฟล์cmdline/apt-get.ccจากแหล่ง tarball ที่http://packages.ubuntu.com/source/maverick/aptฉันจะเห็นว่า--auto-removeเป็นอาร์กิวเมนต์ที่เปิดใช้งานAPT::Get::AutomaticRemoveการตั้งค่า

คำสั่งautoremoveและสายทั้งสองฟังก์ชั่นremoveDoInstall

คำสั่ง "autoremove" ชุดเกินไปและมันไม่ดังนั้นจึงเป็นสิ่งเดียวกับAPT::Get::AutomaticRemove--auto-remove

เมื่อมองในDoAutomaticRemoveฟังก์ชั่นจะเห็นได้ชัดเจนว่าการเปิดใช้งานการAPT::Get::AutomaticRemoveตั้งค่า ( --auto-removeและautoremoveทำเช่นนี้) ทำให้ 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](ลบไฟล์การกำหนดค่าด้วยถ้ามี)


สิ่งใดที่คุณแนะนำให้นำออกเพียง xxx และการอ้างอิงที่ไม่ได้ใช้แล้ว โปรดระบุว่าในคำตอบสำหรับการเรียนรู้ของฉันขอบคุณ!

1
คุณไม่สามารถยกเว้นแพ็กเกจจาก autoremove ถ้าคุณต้องการที่จะให้แพคเกจจากการเป็นอัตโนมัติลบลบพวกเขาด้วยหรือapt-get purge apt-get remove
Lekensteyn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.