升级OS X后应如何修复Homebrew安装?


25

语境

我的老板给了我MacBook Pro,用于开发工作。但是,我在研究小组中所做的大部分开发工作都是针对Linux平台的,并且由于多种政策原因,我无法在此便携式计算机上安装虚拟化软件。Homebrew看起来是安装这些工具的好方法,特别是因为它看起来很容易被黑客入侵(因为它使用Ruby; MacPorts看起来不容易黑客攻击,因为它使用了Tcl)。但是,Homebrew依赖系统库,并且出于安全原因,我的雇主可以(并且据我所知,经常会)随时升级我的系统。我听说OS X的升级将破坏Homebrew。(例如,请参阅/programming/7779300/how-should-i-upgrade-xcode-after-upgrading-to-os-x-lion)。

OS X升级后,如何解决我的Homebrew安装问题?我可以删除它,然后从头开始,只要可以自动进行,就可以了。(例如,使用Puppet加上Homebrew提供程序来编写将在运行Shell脚本时自动构建的配置的脚本。)我到处都在Google搜索,似乎找不到该问题的任何答案。

Answers:


8
brew update

更新Homebrew安装。如果有任何错误,应通过进行报告brew doctor。尝试修复其他问题,可以使用卸载脚本,如下所示:

#!/bin/sh
# Just copy and paste the lines below (all at once, it won't work line by line!)
# MAKE SURE YOU ARE HAPPY WITH WHAT IT DOES FIRST! THERE IS NO WARRANTY!

function abort {
  echo "$1"
  exit 1
}

set -e

/usr/bin/which -s git || abort "brew install git first!"
test -d /usr/local/.git || abort "brew update first!"

cd `brew --prefix`
git checkout master
git ls-files -z | pbcopy
rm -rf Cellar
bin/brew prune
pbpaste | xargs -0 rm
rm -r Library/Homebrew Library/Aliases Library/Formula Library/Contributions
test -d Library/LinkedKegs && rm -r Library/LinkedKegs
rmdir -p bin Library share/man/man1 2> /dev/null
rm -rf .git
rm -rf ~/Library/Caches/Homebrew
rm -rf ~/Library/Logs/Homebrew
rm -rf /Library/Caches/Homebrew

并再次安装自制软件。我很确定所有这些都是可以使用puppet配置的。


7

我认为您可能一直在想,是否需要重建所有软件包,而不仅仅是卸载。如果是这样,我知道这通常不是问题,如答案所示

我遇到了问题,尤其是在更改为OS X Mavericks和Xcode 5时,我不得不重新链接我已安装的所有软件包-这是我的脚本:

#!/bin/bash
FORMULAS=(`brew list`);
for FORMULA in "${FORMULAS[@]}"
do 
    echo "brew unlink $FORMULA" && echo "brew link $FORMULA";
    OUTPUT=`brew unlink $FORMULA`;
    echo $OUTPUT;
    OUTPUT=`brew link $FORMULA`;
    echo $OUTPUT;
done

注意输出,某些公式需要--forcelink步骤。

如果仍然无法解决问题,请尝试使用Mike McQuaid的以下命令系列

brew list > brew-list.txt
brew uninstall $(cat brew-list.txt)
brew install $(cat brew-list.txt)

rebuildHomeBrew中现在有一个命令,但是当前不能解决依赖关系。


1
我在新Mac上全新安装了Mavericks,然后从其他Mac恢复了Time Machine备份。它使计算机安装了所有内容,包括Homebrew及其公式,但所有这些都未链接。我使用脚本一次重新链接了所有公式,并进行了修复!就像魅力一样,谢谢。
AlejandroGarcíaIglesias 2014年

1
在一个相关的问题中,我不得不重新敲击/轻按所有水龙头,否则Brew会发现一些公式,即使它声称已经轻按了正确的水龙头。for tap in $(brew tap); do brew untap "$tap"; brew tap "$tap"; done
乔尔·普拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.