62

I would like to install the most recent version of boto, which I do via python setup.py install

Yet when I try to remove the old version the following packages also get removed:

apt-get remove python-boto
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  cloud-init cloud-utils euca2ools python-boto

How can I tell the package manager to remove boto, and them mark it as installed externally (or something like that) so that apt won't try to fix the missing dependency?

3
  • Have you tried <code>sudo dpkg --remove python-boto</code>?
    – dkuntz2
    Dec 16, 2010 at 14:03
  • You could search for all the files it lays down and delete them...though I guess that wouldn't work if it's version were to change (if it received an update) you'd have to carefully delete those files again...and the system might be confused about start/stop scripts et al...so probably not the best option
    – rogerdpack
    Jun 4, 2020 at 20:37
  • 1
    The packages apt-get is indicating it will remove aren't the dependencies of the deb you are removing, the deb you are removing is a dependency of the packages it will remove
    – rakslice
    Sep 15, 2021 at 22:51

6 Answers 6

81

Use dpkg directly, not apt-get or aptitude:

sudo dpkg -r --force-depends "packagename-version"

or

sudo dpkg -r --force-depends "packagename"
1
  • 6
    Right but when I will try to use apt to install something it will detected that the package I've removed with dpkg is missing and will reinstall it. The question how do I make apt not want to reinstall it / ignore it's consistency state? Apr 1, 2011 at 10:44
18

I know this is an old post, but since I recently had a similar problem I would like to share my solution in the hopes that someone in the future finds it useful.

If you installed a package via aptitude it automatically assigns flags to the dependencies (auto) and when you try to remove your package again it tries to remove all its dependencies that have the auto flag still set.

As you can see in my case it's zabbix that i want to remove:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  apache2{u} dbconfig-common{u} fping{u} javascript-common{u} libhtml-template-perl{u} libiksemel3{u} libjs-prototype{u} 
  libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} mysql-server{u} mysql-server-5.1{u} mysql-server-core-5.1{u} php5{u} php5-gd{u} 
  php5-mysql{u} snmpd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 20 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 44.9 MB will be freed.
Do you want to continue? [Y/n/?]

And if we look up the apache package it looks like this

uman@mango:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

the first flag "i" tells us that apache is installed
The next flag "A" stands for automatically installed

So in order to fix this and not having apache, mysql and php uninstalled, we can just remove the auto flag with aptitude like this:

uman@mango:~$ sudo aptitude unmarkauto apache2 mysql-server php5
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

Now it looks like this when removing the zabbix package:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  dbconfig-common{u} fping{u} javascript-common{u} libiksemel3{u} libjs-prototype{u} libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} 
  php5-gd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 12 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 16.6 MB will be freed.
Do you want to continue? [Y/n/?] 

Please check out the man page for aptitude for more details

1
  • This seems like the best answer of all (depending on situation). Shouldn't be too hard to make a command that finds all dependents and pipes them to unmarkauto.
    – johny why
    Sep 12, 2018 at 0:41
17

You can create a dummy .deb package using the equivs utility, it will provide the dependency without installing any files. Then just replace the currently installed package to the dummy version using dpkg -i fake.deb.

1
17

That's exactly what apt-mark hold is for.

apt-mark hold package_name

From the documentation:

hold is used to mark a package as held back, which will prevent the package from being automatically installed, upgraded or removed. The command is only a wrapper around dpkg --set-selections and the state is therefore

To unhold a package:

apt-mark unhold package_name

3
  • 1
    For my situation, this is the recommended approach. Jan 10, 2016 at 6:05
  • 1
    Unfortunately, this fails to hold dependencies. I.e. if I install packages A and B and they share a common dependency X, holding A will not hold X, and removing B will fail with "E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages."
    – MSalters
    Oct 26, 2017 at 12:30
  • 2
    I just get an error when trying to do this: The following packages have unmet dependencies: mysql-server-5.7 : Depends: apparmor (>= 2.10) but it is not going to be installed E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages. Oct 5, 2019 at 15:54
3

AFAIK there is no way to remove a package using APT without also removing those packages that depend on it.

Reference: http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html

1
  • no, this is the one of many purposes for meta-packages Dec 30, 2010 at 1:07
2

To complete João Pinto's answer, you can use my little script to fix broken package, this script will create dummy package with equivs and install it. You can find a article on my blog in french.

Or directly on gist code .

To use it:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .