Câu trả lời được cung cấp bởi Ryan Thomson đang đi đúng hướng. Tuy nhiên, nó sẽ không thể thực hiện công việc (Lý do chi tiết được đưa ra dưới đây).
Cách chính xác (và dễ nhất) là sử dụng -o
với apt
để vượt qua tùy chọn dpkg và buộc bạn dpkg
phải hỏi liệu bạn có muốn giữ lại các tệp cấu hình đã sửa đổi hoặc các tệp gốc. Lệnh sẽ như thế này -
sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo
Điều này sẽ hỏi bạn một câu hỏi như
Configuration file '/etc/foo/foo.conf'
==> Modified (by you or by a script) since installation.
Version in package is the same as at last installation.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** foo.conf (Y/I/N/O/D/Z) [default=N] ?
Bạn phải nhấn Y hoặc I để cài đặt tệp cấu hình gốc của người bảo trì gói. Bạn thậm chí có thể nhấn D để xem những thay đổi hoặc bắt đầu một vỏ gốc với tùy chọn Z để tự khắc phục.
Lưu ý: Sau khi thay thế, bạn sẽ tìm thấy tệp đã sửa đổi của mình dưới dạngat /etc/foo/foo.conf.dpkg-old
Tại sao các tùy chọn khác sẽ không hoạt động?
Bởi vì các tùy chọn khác trong dpkg không hoạt động tốt. Các tùy chọn liên quan đến các tệp cấu hình của gói là
--force-confmiss
--force-confnew
--force-confold
--force-confdef
--force-confmiss
sẽ không hoạt động khi phiên bản gói không thay đổi. Từ trang nam
Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, hãy luôn cài đặt phiên bản mới mà không cần nhắc, trừ khi --force-confdef cũng được chỉ định, trong trường hợp đó, hành động mặc định được ưu tiên.
--force-confmiss
làm việc với các conffiles mất tích. Nó cũng sẽ thất bại khi phiên bản không thay đổi. Trích dẫn man-page
confmiss: Nếu một conffile bị thiếu và phiên bản trong gói đã thay đổi, hãy luôn cài đặt conffile bị thiếu mà không cần nhắc. Điều này rất nguy hiểm, vì điều đó có nghĩa là không bảo toàn thay đổi (xóa) đối với tệp
--force-confold
sẽ chỉ giữ lại phiên bản sửa đổi nếu phiên bản được thay đổi . Đối với cùng một gói, nó cũng sẽ thất bại. Trích dẫn man-page
confold: Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, hãy luôn giữ phiên bản cũ mà không nhắc, trừ khi --force-confdef cũng được chỉ định, trong trường hợp đó, hành động mặc định được ưu tiên.
--force-confdef
cũng sẽ thất bại vì hành động mặc định là giữ lại tệp cũ hơn (Được chỉ ra từ thông báo hiển thị với --force-confask
. Nó có dòng (Y/I/N/O/D/Z) [default=N]
có nghĩa là giữ lại là mặc định. Xem ở trên). Và nếu --force-confnew
được chỉ định nhưng phiên bản không thay đổi, điều đó cũng sẽ không hoạt động. Trích dẫn man-page
confdef: Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, luôn chọn hành động mặc định mà không cần nhắc. Nếu không có hành động mặc định, nó sẽ dừng lại để hỏi người dùng trừ khi - Force-confnew hoặc --force-confold cũng được đưa ra, trong trường hợp đó, nó sẽ sử dụng điều đó để quyết định hành động cuối cùng.
Chỉ --force-confask
hoạt động, bởi vì nó sẽ hỏi bạn câu hỏi ngay cả khi phiên bản giống nhau. Trích dẫn man-page
confask: Nếu một conffile đã được sửa đổi, luôn luôn cung cấp để thay thế nó bằng phiên bản trong gói, ngay cả khi phiên bản trong gói không thay đổi (kể từ dpkg 1.15.8). Nếu bất kỳ - Force-confmiss , --force-confnew , --force-confold , hoặc --force-confdef cũng được đưa ra, nó sẽ được sử dụng để quyết định hành động cuối cùng.
Hy vọng rằng sẽ giúp.
foo
, điều gì xảy ra nếubar
phụ thuộc vàofoo
và tôi không muốn xóabar
?