Làm thế nào để loại bỏ các phụ thuộc được đề xuất và đề xuất của các gói được gỡ cài đặt?


16

Tôi biết Làm thế nào để loại bỏ các phụ thuộc của gói đã gỡ cài đặt? và tôi đã thử

apt-get autoremove

nhưng điều đó không loại bỏ các phụ thuộc được đề xuất / đề xuất bởi các gói khác.

Đó là, nếu tôi cài đặt gói X khuyến nghị Y, nhưng tôi không cài đặt Y, và sau đó tôi cài đặt gói Z phụ thuộc vào Y. và sau đó tôi sẽ

apt-get remove --auto-remove Z

sau đó Y không được tự động loại bỏ mặc dù không có gì phụ thuộc vào nó. (X "nhặt" Y, mặc dù nó không phụ thuộc vào nó).


1
Thay vào đó, bạn có thể nói gói nào làm việc này không?
Braiam

Có rất nhiều ví dụ, vì vậy tôi đã cố gắng trích xuất bản chất của vấn đề trong phần mô tả ở trên. Bạn nói đúng rằng tôi cũng nên bao gồm một ví dụ cụ thể: Xem xét việc cài đặt texlive-full. Nó cài đặt rất nhiều gói phông chữ, được đề xuất (nhưng không bắt buộc) bởi nhiều gói tồn tại trước đó (tôi không thể nhớ chính xác, nhưng tôi nghĩ libreoffice hoặc matplotlib hoặc octave đã đề xuất trước đó). Vì vậy, vấn đề là "apt-get install texlive-full" theo sau là "apt-get remove --purge --auto-remove texlive-full" không để hệ thống ở trạng thái ban đầu.
user2809402

Câu trả lời:


14

Nếu bạn muốn xóa các gói được đề xuất khỏi hệ thống của mình, ngay cả khi vẫn còn một số gói đã cài đặt đề xuất (hoặc đề xuất) chúng, hãy đặt các mục sau vào tệp /etc/apt/apt.conf.d/99_norecommends(tạo tệp):

APT::Install-Recommends "false";
APT::AutoRemove::RecommendsImportant "false";
APT::AutoRemove::SuggestsImportant "false";

Các tài liệu cho các tùy chọn này là ở đây .

Sau đó, lần chạy apt tiếp theo sẽ loại bỏ tất cả. Nếu không, khởi chạy aptitudevà gõ ggmột lần nữa.

Cấu hình này cũng vô hiệu hóa cài đặt tự động các gói được đề xuất khi sử dụng apt-get. Đối với aptitudenó có thể được thực hiện từ GUI của bàn điều khiển, menu Tùy chọn> Tùy chọn> "Cài đặt các gói được đề xuất tự động" (bỏ chọn nó).


Tôi không khuyên bạn không nên cài đặt các khuyến nghị vì hầu hết thời gian đều hữu ích .
Braiam

1
@Braiam Đây không phải là những gì OP yêu cầu. Nhận xét của bạn là cho anh ấy, không phải cho tôi.
Totor

Tôi chỉ nói rằng đó có thể là quá mức cần thiết.
Braiam

@Braiam Đó là POV của bạn. Tôi sống khá tốt với InstallRecommendsngười khuyết tật. Đối với bản ghi, nó đã bị tắt theo mặc định cho đến khi Debian Squeeze được phát hành, đó là từ tháng 2 năm 2011 (không biết về Ubuntu). Hơn nữa, bạn có thể không cần cấu hình tương tự trên máy chủ hoặc thiết lập máy tính để bàn.
Totor

2
InstallRecommends: Bởi vì tại sao cài đặt 5MB nội dung bạn muốn, khi nào bạn cũng có thể cài đặt 1GB nội dung bạn không muốn?
Mark K Cowan

7

Ghi đè tùy chọn APT

Không giống như phụ thuộc, các gói "được đề xuất" hoặc "được đề xuất" tự động có thể bị bỏ qua apt-get autoremove.

Như được mô tả ở nơi khác, hành vi này của APT có thể được thay đổi trong cấu hình.

Tương tự, cấu hình của apt-getlệnh có thể được thay đổi tạm thời thông qua -otùy chọn dòng lệnh.

Đây là, làm thế nào bạn sẽ buộc autoremove loại bỏ các gói "được đề xuất" và "được đề xuất" còn lại, ngoài các phụ thuộc không sử dụng.

sudo apt-get autoremove -o APT::Autoremove::RecommendsImportant=0 -o APT::Autoremove::SuggestsImportant=0

Chú ý!

Một số chức năng có thể bị mất. Hãy chuẩn bị để điều tra và cài đặt lại mọi thứ. Có thể dễ dàng hơn để lại các gói này một mình.

Sự lựa chọn khác

Để gỡ cài đặt các gói 'được đề xuất' và 'được đề xuất' chỉ cho một gói cụ thể, hãy xem nhật ký lịch sử apt.


1
chỉ đơn giản là phân tích các gói như vậy, thực hiện một chạy khô với apt-get's -slựa chọn và ống để grep ^Remv- vì vậy đó là lệnh:apt-get autoremove -s -o APT::Autoremove::RecommendsImportant=0 -o APT::Autoremove::SuggestsImportant=0 | grep ^Remv
myrdd

1

Trên thực tế lệnh là:

sudo apt-get autoremove <Z>

Nhưng điều này có một mẹo! Nếu bất kỳ phụ thuộc nào có một số gói được cài đặt trước đó đề xuất / đề xuất chúng thì apt sẽ không xóa chúng.

Bạn đã không chỉ định gói là gì nhưng ví dụ: nếu tôi cài đặt plugin IcedTea, nó sẽ cài đặt Java / OpenJRE theo phụ thuộc. Nếu tôi gỡ cài đặt chúng bằng cách sử dụng, sudo apt-get autoremove icedtea-7-pluginbạn sẽ nhận thấy rằng nó sẽ không xóa Java / OpenJRE, vì LibreOffice cũng đề xuất các gói.

Vì vậy, để loại bỏ chúng, bạn phải quá cụ thể về gói bạn muốn gỡ cài đặt mà bình thường autoremovesẽ không:

sudo apt-get autoremove <Z> <dependency of Z>

Bằng cách này bạn có thể chắc chắn gói của bạn được gỡ bỏ.

Bạn cũng có thể sử dụng deborphan để loại bỏ một số phụ thuộc.


1
Nhân tiện, sự hiểu biết của tôi từ trang chủ apt là autoremove không mong đợi một tên gói và sẽ đơn giản xóa sạch tất cả các phụ thuộc gói không cần thiết trong hệ thống. Vì vậy, bạn sẽ phải thực hiện 2 bước: "apt-get remove Z" theo sau là "apt-get autoremove". Hai bước này có thể được thực hiện cùng một lúc với "apt-get remove --auto-remove Z", như đã đề cập trong câu hỏi ban đầu của tôi. Nhưng như tôi đã nói, vấn đề là có một số gói còn sót lại không bị xóa nếu chúng được đề xuất bởi thứ khác.
user2809402

1
Vâng, bạn đã mô tả vấn đề của tôi một cách hoàn hảo. Cảm ơn bạn. Nhưng, thật không may, bạn chưa giải quyết được, vì tôi không muốn truy cập /var/log/apt/history.log và tìm tất cả các gói Y đã cài đặt vài tháng trước với Z (trong ví dụ của bạn, Y = java / jre, Z = icedtea plugin) và sau đó thêm thủ công tất cả chúng vào dòng lệnh apt. Tôi muốn chỉ định Z và phần còn lại của các phụ thuộc sẽ được chọn tự động, ngay cả khi chúng được đề xuất bởi gói X hiện có khác (X = libreoffice trong ví dụ của bạn).
user2809402

1
Thật không may, đây là cách hệ thống apt hoạt động, nó thích giữ các gói được cài đặt hơn là loại bỏ chúng, ngay cả khi chúng không còn cần thiết nữa. Cách duy nhất để loại bỏ chúng là thủ công hoặc với deborphannhưng deborphan có thể vẫn còn thiếu một số gói. Bạn có thể sử dụng các Debug::tùy chọn và cũng kiểm tra câu trả lời khác của tôi về điều này . Bạn cũng có thể sử dụng --no-install-recommends, nhưng apt-get không cài đặt các gói được đề xuất theo mặc định.
Braiam

@ user2809402 bạn cũng nên kiểm tra Askubfox.com/q/244470/169736
Braiam

Braiam- Cảm ơn con trỏ gỡ rối. Tôi sẽ kiểm tra nó.
user2809402

-1

Đúng, nếu bạn muốn loại bỏ gói <Z>với phụ thuộc chỉ cần gõ:

sudo apt-get autoremove --purge <Z>

3
Cảm ơn, nhưng thật không may, việc thêm "--purge" chỉ đơn giản là loại bỏ các cấu hình của các gói được loại bỏ bằng "autoremove". Nhưng như xa như tôi có thể thấy, nó không làm thay đổi quyết định về gói để loại bỏ. Đó là, các phụ thuộc của Z được đề xuất bởi một số gói X có sẵn, vẫn không bị xóa, cho dù tôi có chỉ định "--purge" hay không.
user2809402

1
Ngoài ra, autoremovecông trình toàn hệ thống. Vì vậy, bất cứ khi nào bạn gọi autoremove, nó sẽ xóa tất cả các gói không sử dụng trên hệ thống của bạn. Cài đặt một gói, sau đó autoremovingthường sẽ không đưa hệ thống về trạng thái tương tự, và thay vào đó sẽ để lại một loạt các gói "còn sót lại".
Rolf
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.