83

I have installed some rpm package on my Fedora 17. Some packages had a lot of dependencies. I have removed some packages but I forgot remove unused dependencies with yum remove.

How can I do that now?

2

5 Answers 5

133

If you install a package with yum install, say pdftk, it will pull in a lot of dependencies:

Installed: pdftk.x86_64 0:1.44-10.fc18 Dependency Installed: bouncycastle.noarch 0:1.46-6.fc18 itext-core.noarch 0:2.1.7-14.fc18 libgcj.x86_64 0:4.7.2-8.fc18 bouncycastle-mail.noarch 0:1.46-6.fc18 java-1.5.0-gcj.x86_64 0:1.5.0.0-40.fc18 sinjdoc.x86_64 0:0.5-13.fc18 bouncycastle-tsp.noarch 0:1.46-5.fc18 java_cup.noarch 1:0.11a-10.fc18 itext.x86_64 0:2.1.7-14.fc18 javamail.noarch 0:1.4.3-12.fc18 Complete! 

yum remove pdftk will remove only that package and not all the dependencies.

But you can look at all the 'transactions' (install, remove etc.):

$ sudo yum history list pdftk ID | Command line | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 88 | install pdftk | 2012-12-14 13:35 | Install | 11 

And then you can undo that transaction:

$ sudo yum history undo 88 Undoing transaction 88, from Fri Dec 14 13:35:34 2012 Dep-Install bouncycastle-1.46-6.fc18.noarch @fedora Dep-Install bouncycastle-mail-1.46-6.fc18.noarch @fedora Dep-Install bouncycastle-tsp-1.46-5.fc18.noarch @fedora Dep-Install itext-2.1.7-14.fc18.x86_64 @fedora Dep-Install itext-core-2.1.7-14.fc18.noarch @fedora Dep-Install java-1.5.0-gcj-1.5.0.0-40.fc18.x86_64 @fedora Dep-Install java_cup-1:0.11a-10.fc18.noarch @fedora Dep-Install javamail-1.4.3-12.fc18.noarch @fedora Dep-Install libgcj-4.7.2-8.fc18.x86_64 @fedora Install pdftk-1.44-10.fc18.x86_64 @fedora Dep-Install sinjdoc-0.5-13.fc18.x86_64 @fedora ... Complete! 
5
  • 17
    +1 Awesome solution and very easy to do. I've never heard of yum history. Thanks! Commented May 14, 2014 at 20:24
  • 8
    And what if 89 depends on java_cup or libgcj? Commented May 24, 2016 at 12:28
  • 2
    Shouldn't this be an accepted answer? Commented Mar 7, 2018 at 11:00
  • @WernerCD, in debian dpkg etc comlains that a package can not be removed if another depends on it. Ohe could hope the same happens here. Commented Dec 27, 2019 at 13:52
  • No longer necessary, see some of the other answers... Commented Nov 30, 2020 at 18:38
101

Starting from Fedora 18, you can simply use this command

yum autoremove 

or

yum remove --setopt=clean_requirements_on_remove=1 

You can also apply autoremove command with specific package

yum autoremove <package> 

Which will remove unneeded dependencies from that installed package. autoremove is very much an alias of remove --setopt=clean_requirements_on_remove=1 but for some reasons, is still undocumented.

4
  • 6
    command yum remove --setopt=clean_requirements_on_remove=1 works for me in centOS Commented Jul 13, 2014 at 9:57
  • 2
    For me the package-cleanup --leaves && yum autoremove removed libvorbis and so made the internet-radio-streaming "Ices" application die -- probably because it isn't in repos and I had to compile it. Commented Dec 11, 2018 at 20:22
  • 1
    Command yum autoremove works on CentOS 7.6 as well. Commented Feb 1, 2019 at 22:20
  • yum autoremove fails to remove 4 old kernels on CentOS 7 Commented Sep 18, 2019 at 12:51
46

It's not easy. How do you differentiate between "a file that was required by something I have since removed" from "a file that is not required by anything else that I really want"?

You can use the package-cleanup command from the yum-utils package to list "leaf nodes" in your package dependency graph. These are packages that can be removed without affecting anything else:

$ package-cleanup --leaves 

This will produce a list of "libraries" on which nothing else depends. In most cases you can safely remove these packages. If you add --all to the command line:

$ package-cleanup --leaves --all 

You'll get packages that aren't considered libraries, also, but this list is going to be so long that it probably won't be useful.

2
  • 10
    APT (the Debian equivalent of Yum) has a notion of “automatically installed package”. If a package wasn't explicitly requested but only pulled in as a dependency, it'll be automatically removed (with a confirmation prompt) if the packages that depend on it are all removed. Without an indication of this type, it is indeed not easy. Commented Jun 6, 2012 at 23:53
  • 1
    missed command to remove all packages directly from package-cleanup --leaves Commented Jan 10, 2020 at 14:43
12

I took larsks answer one step farther.

$ package-cleanup -q --leaves | xargs -l1 yum -y remove 

This grabs all of the dependencies that can be removed without affecting anything else and then removes them. Better then going through one by one.

"-q" is useful on some systems which print "Setting up yum" otherwise, causing this command to remove yum. And that's not what you want.

5
  • 4
    package-cleanup outputs "Setting up yum" on my machine, which resulted in Yum removing itself. I'm now trying to figure out how to sort this out. Commented Feb 1, 2015 at 17:05
  • @PaulLammertsma just add -q option to package-cleanup. This happened to me as well :D Commented Aug 3, 2015 at 15:23
  • 1
    package-cleanup -q --leaves | xargs -r -l1 yum -y remove will silently skip xargs if package-cleanup output is empty, useful for automated scripts like ansible, chef, puppet, vagrant Commented Oct 5, 2018 at 16:02
  • this is The Answer. Commented May 1, 2019 at 15:47
  • Because "...removed without affecting anything else..." you should remove the -y so that future users won't get burned by whatever burned @Paul Lammertsma Commented Jul 7, 2021 at 16:22
6

In newer Fedoras with dnf, you can use dnf repoquery --unneeded as a replacement for package-cleanup --leaves.

You must log in to answer this question.