Làm thế nào tôi có thể hạ cấp các gói mà không loại bỏ người phụ thuộc của họ?


17

Tôi có một số gói mesa mà tôi đã nâng cấp lên phiên bản PPA, trước khi thanh trừng PPA để tôi có thể nâng cấp hệ thống của mình. Sự khác biệt trong các phiên bản là nhỏ (về mặt kỹ thuật là như nhau, chỉ có một bộ thư viện là từ git và các phiên bản khác là phiên bản cuối cùng).

Nếu tôi cố hạ cấp thông qua Synaptic, apt-get hoặc aptitude, tôi sẽ bị ném vào địa ngục phụ thuộc.

Có cách nào để hạ cấp các gói theo cách thủ công (có thể từng cái một) và đánh dấu các gói phụ thuộc của chúng là bất động (nếu điều đó có ý nghĩa) cho đến khi tôi hoàn thành?

PS câu hỏi này: Làm thế nào để hạ cấp Gói thông qua apt-get? là một chút khác biệt và không giúp đỡ tình huống này.


Tại sao không phải là bạn ppa-purgeđầu tiên?
Landroni

Bạn có thể cài đặt lại gói. Ví dụ: nếu bạn sử dụng synaptic, khi bạn chọn gói xyz, tất cả các phụ thuộc sẽ được chọn theo mặc định. Nhưng bạn luôn có thể bỏ chọn tất cả các phụ thuộc và chỉ cần cài đặt gói chính. Bạn có thể cài đặt lại tất cả các phụ thuộc. Điều này chỉ hoạt động nếu bạn đã sẵn sàng để cài đặt lại.
Người dùng đã đăng ký

@landroni nếu tôi thanh lọc, nó sẽ xóa các gói tôi không muốn xóa.
RolandiXor

Câu trả lời:


13

Tôi chưa bao giờ chơi với cái này trước đây, nhưng tôi sẽ đề nghị bạn hold(hoặc lock) phiên bản của các phụ thuộc gây rắc rối cho bạn. Cách này aptcó số lượng giải pháp khả thi hạn chế hơn và có lẽ không bị lẫn lộn khi bạn cố hạ cấp các gói khác.


Nếu không có gì khác hoạt động, bạn có thể thực hiện phương pháp thủ công được đề xuất trong câu trả lời này: Làm thế nào để hạ cấp Gói thông qua apt-get? . Về cơ bản, tải xuống các .debgói cần thiết theo cách thủ công, sau đó cài đặt từng gói một bằng cách sử dụng mức thấp hơn dpkgvà một trong các đối số mạnh mẽ của nó:--ignore-depends , --force-depends, --force-depends-version, hoặc thậm chí --force-all.

Theo tinh thần như trên, bạn có --force-downgrade lập luận:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Nhưng điều này giả định rằng bạn đã đọc man dpkg và bạn hiểu những gì bạn làm:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Xem Lỗi: số phiên bản không bắt đầu bằng chữ sốCách cài đặt phiên bản Java cũ hơnCách cài đặt phiên bản cũ hơn của gói như chất lỏng 2.2.2?ví dụ về:

sudo dpkg --force-downgrade -i your_mesa_package.deb

Và xem Làm thế nào tôi có thể cài đặt một gói mà không cần cài đặt một số phụ thuộc? cho một ví dụ (cùng với cảnh báo thích hợp) của:

sudo dpkg --force-all -i your_mesa_package.deb

Tuy nhiên, một cách tiếp cận khác là tạo ra một .debgói giả bằng cách sử dụng equivsgói (và có lẽ là một tên hơi khác). Sau đó, cài đặt gói giả sẽ cho phép bạn loại bỏ gói "thật" trong khi vẫn giữ các deps liên quan, sau đó cài đặt phiên bản cũ hơn. Tôi không chắc chính xác nó sẽ hoạt động như thế nào, nhưng hãy kiểm tra chủ đề có liên quan này để biết chi tiết: Cách xóa một cuộc tranh luận mà không loại bỏ các phụ thuộc của nó .


4

Trước tiên, bạn có thể sử dụng apt-markđể đánh dấu tất cả phụ thuộc gói mục tiêu (và có thể được đề nghị / những gợi ý quá) được cài đặt trong hệ thống như thủ công cài đặt. Sau khi làm điều đó, cài đặt các phiên bản trước của phần mềm với việc apt-getđề cập rõ ràng phiên bản.

  • Để liệt kê các gói phụ thuộc, các gói được đề xuất và được đề xuất cho gói mục tiêu:

    apt-cache show <target-package-name>
    
  • Đánh dấu các gói như được cài đặt thủ công :

    sudo apt-mark manual <package-name(s)>
    

    (sử dụng điều này cho tất cả các phụ thuộc, khuyến nghị và đề xuất.)

  • Xóa gói mục tiêu:

    sudo apt-get remove <target-package-name>
    
  • Để xem danh sách các phiên bản gói mà bạn có thể hạ cấp / nâng cấp lên, hãy sử dụng:

    apt-cache policy <target-package-name>
    
  • Cài đặt phiên bản đích của gói yêu cầu:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    hoặc là

    sudo apt-get -t=<target release> install <target-package-name>
    

Tái bút Nếu danh sách các gói phụ thuộc / gói được đề xuất / được đề xuất, tức là những gói được đánh dấu apt-marklà lớn, hãy lưu danh sách dự định của đầu ra được đóng gói bằng apt-cache show <target-package-name>bất kỳ tệp nào nói /path/to/foovà sử dụng apt-marktrong một kết hợp như thế này:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese

Phương pháp này có thể hoạt động, nhưng thay vì đánh dấu hơn 100 gói, tôi chỉ đi với câu trả lời khác.
RolandiXor

@RolandiXor, bạn có thể sử dụng apt-cache policy <target-package-name>để có danh sách các phiên bản gói mà bạn có thể hạ cấp / nâng cấp lên ..
chính xác là

.. xin vui lòng tham khảo các chỉnh sửa được thực hiện cho bài viết; nếu số lượng tệp lớn hơn được đánh dấu, bạn có thể sử dụng kết hợp lệnh bao gồm ...
chính xác là

Tôi không nghĩ bạn hiểu tôi. Dù sao, tôi đã sửa nó ngay bây giờ và tôi đã đưa ra tiền thưởng (không thể chuyển đổi nó).
RolandiXor

1

Tôi vừa trải qua nỗi đau khi nâng cấp lên phiên bản ngược dòng của gói và sau đó quyết định hạ cấp. Điều này đã thông qua một kho lưu trữ tư nhân bảo trì. Trong trường hợp của tôi, đây là tất cả về việc dùng thử phiên bản systemd 233 mới nhất (chưa được phát hành).

Điều quan trọng là phải hiểu rằng bạn cần chỉ định tất cả các gói nên được hạ cấp. Nếu bạn làm đúng, rất có thể apt sẽ làm những gì bạn muốn. Nếu bạn bỏ lỡ điều gì đó, apt sẽ cho bạn biết rằng hành động đó sẽ khiến rất nhiều gói bị xóa. Để đảm bảo chúng tôi sử dụng cờ '-s' để thử hạ cấp trước khi thực sự làm điều đó.

Các bước bạn cần thực hiện là:

1) Liệt kê tất cả các phụ thuộc đã được nâng cấp lên thượng nguồn (sử dụng một số từ khóa khác nếu tình huống của bạn khác):

dpkg -l|grep upstream

Điều này cung cấp cho bạn một danh sách các gói với số phiên bản ngược dòng.

2) Liệt kê phiên bản ổn định chính xác cho mỗi gói:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Kiểm tra lại tất cả là tốt:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(không chắc chắn nếu - yêu cầu cài đặt btw, nhưng đây là những gì tôi đã làm)

4) Hủy bỏ các -s và làm điều đó.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
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.