我有一个源包(foo
),它生成两个二进制包(foo-a
和foo-b
)。
在 2.0 版本中,文件/etc/foo
从 移动foo-a
到foo-b
.这会导致apt upgrade
失败:
$ sudo apt upgrade
...
dpkg: error processing archive /var/cache/apt/archives/foo-b_2.0_amd64.deb (--unpack):
trying to overwrite '/etc/foo', which is also in package foo-a 1.0.
有没有客户端解决方案可以apt
解决这个问题?
答案1
正确的(tm)解决方案是通过修复以下内容来修复foo-a
和的依赖性:foo-b
debian/control
Package: foo-b
Replaces: foo-a (<< 2.0)
Breaks: foo-a (<< 2.0)
参考:https://www.debian.org/doc/debian-policy/ch-relationships.html#overwriting-files-in-other-packages
但是,如果您不是此包的开发人员或存储库的维护者,则您将需要客户端解决方案。
有效的客户端解决方案是使用--force-overwrite
以下选项dpkg
:
$ apt download foo-{a,b}
$ dpkg --force-overwrite -i foo-{a,b}_2.0_amd64.deb
参考:https://man7.org/linux/man-pages/man1/dpkg.1.html#OPTIONS
但是,如果您正在寻找apt
-only 1-liner,那么您需要apt
将--force-overwrite
选项转发到dpkg
。这可以通过使用--option
中简要描述的来完成apt-get(8)
。 apt.conf(5)
说DPkg::options
可用于将选项转发到dpkg
.
这些手册页都没有清楚地定义整个语法,所以经过一些实验,我发现可以像这样完成:
$ sudo apt upgrade -o DPkg::options::="--force-overwrite"
...
Unpacking foo-b (2.0) over (1.0) ...
dpkg: warning: overriding problem because --force enabled:
dpkg: warning: trying to overwrite '/etc/foo', which is also in package foo-a 1.0
...