Đặt tùy chọn apt-get để dung nạp loại bùn vô hại 'dpkg - lực lượng xung đột'?


7

Một gói foo xung đột tầm thường có thể được thực hiện để làm việc với thanh , bằng cách chạy dpkg --force-conflicts -i foo. Nhưng cuối cùng cũng đến lúc nâng cấp và các đối tượng 'apt-get':

% apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
 foo : Conflicts: bar but 0.2-1 is installed
E: Unmet dependencies. Try using -f.

Có thể apt-get được tinh chỉnh / buộc phải chịu đựng cuộc xung đột (khá nhiều cố định), sau đó nâng cấp?

(Quickie tồn tại bằng chứng: gỡ bỏ cài đặt foo , sau đó nâng cấp, sau đó cài đặt lại foo như trước Vì vậy nó. có thể, câu hỏi là tìm cơ chế cồng kềnh nhất.)


Một ví dụ, nhưng câu hỏi này không phải là về bất kỳ hai gói cụ thể .

Trong nhiều năm, song song GNU đã có một cuộc xung đột không đáng kể với moretutils ; mỗi cung cấp / usr / bin / song song . dpkg có thể buộc cùng tồn tại:

# assume 'moreutils' is already installed, and 'parallel' is in
# apt's cache directory.
dpkg --force-conflicts -i /var/cache/apt/archives/parallel_20141022+ds1-1_all.deb

Điều này tạo ra một dòng, đổi tên các moreutils phiên bản để /usr/bin/parallel.moreutils . Cả hai chương trình hoạt động, cho đến khi người dùng nâng cấp.

Tôi đã thử một tùy chọn -o , nhưng điều đó không mang lại hòa bình:

apt-get -o Dpkg::Options::="--force-conflicts" install parallel moreutils

Có thể -o số tùy chọn trong hàng trăm, tuy nhiên ...


1
"Apt-get có thể bị buộc phải chịu đựng xung đột (khá nhiều cố định), sau đó nâng cấp không?" Xin lỗi, nó không cố định. Bạn cần sửa nó trước khi làm bất cứ điều gì khác. Và không, các gói xung đột có thể được thực hiện để làm việc với nhau. Và --forcingmọi thứ nói chung là một ý tưởng tồi trừ khi bạn biết những gì bạn đang làm.
Faheem Mitha

@FaheemMitha, "nó không cố định" đề cập đến những gì cụ thể? Mức dpkg , mức apt hay gì?
agc

PS: Tôi đã được thông báo (bởi @derobert) rằng đây là biểu hiện của lỗi Debian 749355 . Bạn nên đề cập rằng trong câu hỏi. Nhưng bạn vẫn không nên cố gắng làm cho các gói này cùng tồn tại.
Faheem Mitha

Cả hai dpkgaptrõ ràng không hài lòng với tình hình hiện tại. Và cách duy nhất để sửa chữa mọi thứ là không cài đặt cả hai gói. Thers không phải là cách tốt để xoa dịu họ, và cố gắng làm như vậy sẽ không dẫn đến đâu cả.
Faheem Mitha

@FaheemMitha, "câu hỏi này không phải là về hai gói cụ thể."
agc

Câu trả lời:


5

Vì OP đã yêu cầu một danh sách các lệnh (để thay đổi siêu dữ liệu có liên quan của gói) trong các nhận xét cho câu trả lời của Gilles, nên đây là:

# download .deb
apt download parallel
# alternatively: aptitude download parallel

# unpack
dpkg-deb -R parallel_*.deb tmp/

# make changes to the package metadata
sed -i \
  -e '/^Version:/s/$/~nomoreutconfl/' \
  -e '/^Conflicts: moreutils/d' \
  tmp/DEBIAN/control

# pack anew
dpkg-deb -b tmp parallel_custom.deb

# install
dpkg -i parallel_custom.deb

Đây là theo giả định rằng dòng xung đột chỉ có moreutilsmột mục (và không có giới hạn phiên bản) như trong trường hợp cài đặt của tôi. Mặt khác, sử dụng '/^Conflicts:/s/\(, \)\?moreutils\( [^,]\+\)\?//'làm sedtập lệnh thứ hai để chỉ loại bỏ phần có liên quan của dòng và giới hạn phiên bản hỗ trợ.

Gói đã cài đặt của bạn sẽ không bị ghi đè bởi các phiên bản mới hơn từ kho lưu trữ và bạn phải lặp lại quy trình này theo cách thủ công cho mỗi bản cập nhật cho gói song song GNU nếu bạn muốn cập nhật gói này.


1
Vâng, điều đó hoạt động nhưng apt upgradephàn nàn rằng song song (cùng phiên bản với .deb vừa được điều chỉnh) có been kept back. Tuy nhiên, đó là một cải tiến về dpkg --force-conflictsphương pháp, trong đó mọi nâng cấp đều phá vỡ một trong các chương trình - phương thức phk cho phép mọi nâng cấp khác.
agc

3

Một cuộc xung đột giữa các gói có hại trong chính nó. Khi bạn buộc dpkgphải cài đặt các gói xung đột, điều này có thể không gây ra bất kỳ tác hại nào khác nếu xung đột được tuyên bố không có lý do chính đáng, nhưng các gói vẫn xung đột. APT làm việc chăm chỉ để giải quyết xung đột khi cài đặt các gói và nó không có danh sách các xung đột cần bỏ qua. Bạn không thể giải quyết điều này bằng cách làm cho nó vượt qua các tùy chọn khác nhau để dpkg: vấn đề là xung đột làm cho công việc của APT không thể thực hiện được.

Không bao giờ cài đặt các gói xung đột trừ khi đó là trạng thái tạm thời để thoát khỏi tình huống APT bị hỏng. Đừng chạy APT cho đến khi bạn làm việc dpkgđể thoát khỏi tình huống xung đột.

Nếu bạn muốn cài đặt các gói xung đột, trước tiên hãy sửa đổi chúng để xóa Conflict:khai báo, ngoài việc giải quyết bất kỳ vấn đề nào thúc đẩy tuyên bố xung đột.


bạn có thể giải thích ngắn gọn về cách bạn "sửa đổi chúng trước để xóa Conflict:khai báo" không?
agc

1
@agc Hoặc xây dựng lại gói hoặc sửa đổi gói nhị phân bằng cách mở gói trong trình chỉnh sửa như Emacs và chỉnh sửa controltệp hoặc sửa đổi gói nhị phân bằng cách giải nén gói, chỉnh sửa controltệp và đóng gói lại.
Gilles 'SO- ngừng trở nên xấu xa'

cảm ơn, nhưng vui lòng cụ thể hơn, tốt nhất là sử dụng sed(hoặc một cái gì đó tương tự) thay vì trình chỉnh sửa GUI . Mục tiêu là một lớp lót tương đối hoàn hảo, càng xa càng tốt.
agc
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.