我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。

例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。

我该怎么做呢?

必须有一种方法来卸载一个包而不留下不必要的垃圾。


当前回答

@jfmercer的答案必须稍微修改一下才能使用当前的brew,因为缺少brew的输出已经改变:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install

其他回答

这里的目标是删除给定的包及其依赖关系,而不破坏另一个包的依赖关系。我使用这个命令:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

注:经过编辑以反映@alphadogg的有用评论。

@jfmercer的答案必须稍微修改一下才能使用当前的brew,因为缺少brew的输出已经改变:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install

其他答案对我来说都不管用,但这个答案(用鱼壳)管用:

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

因为当其他包依赖于p时,brew remove $p失败。

基于@jfmercer的回答(更正需要的不仅仅是评论)。

删除包的依赖项(不删除包):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

删除包:

brew remove [FORMULA]

重新安装丢失的库:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

在发现MeldMerge发布后测试卸载meld。

使用这个答案需要创建并维护一个文件,其中包含希望安装在系统上的包名。如果您还没有安装包,请使用以下命令并删除您不想保留安装的包名。

brew leaves > brew_packages

然后,您可以通过运行以下命令删除所有已安装但不需要的包和任何不必要的依赖项

brew_clean brew_packages

Brew_clean可以在这里找到:https://gist.github.com/cskeeters/10ff1295bca93808213d

该脚本获取您在brew_packages中指定的所有包及其所有依赖项,并将它们与brew list的输出进行比较,最后在与用户验证该列表后删除不需要的包。

此时,如果您想删除包a,只需从brew_packages文件中删除它,然后重新运行brew_clean brew_packages。它会移除b,但不会移除c。