Homebrewをアップデートしようと思ったらエラーになった話

エラーになったよ

先日、Homebrewを久しぶりにアップデートをしようと思いたち、以下コマンドを実行しました。
(ちなみに現在は3.2.6。リリース情報を確認すると現時点の最新は4.1.1でした。)

brew update

するとどうでしょう。

Error: 
  homebrew-core is a shallow clone.
To `brew update`, first run:
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
This command may take a few minutes to run due to the large size of the repository.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!

おやおやErrorではないですか…

エラー文を頼りにコマンドを実行する

とりあえずエラー文を読むに、`brew update`を実行するにはまず以下を実行しなさいとのこと。

git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow

調べて見たところ、4.0.0からパッケージ情報をJSONで管理するようになったらしく、homebrew-coreのgitリポジトリをshallow cloneする必要がなくなったみたいです。

shallow cloneは処理が重かったらしく、4.0.0の変更でセットアップは時間短縮し、ディスク容量の節約にもなるとのこと。
https://brew.sh/2023/02/16/homebrew-4.0.0/

このコマンドは指定されたパスにあるリポジトリクローンを shallow なものから完全なものに変更するためのもののようです。

さて、先程のコマンドを実行して数分待つと完了しますのでもう一度アップデートのコマンドを実行してみます。

brew update

こちらも数分待つと以下のように表示されました。(自分の環境では)

You have 14 outdated formulae and 1 outdated cask installed.
You can upgrade them with brew upgrade
or list them with brew outdated.
Error: Could not link:
/usr/local/share/man/man1/brew.1

Please delete these paths and run:
  brew update
Error: Could not link:
/usr/local/share/doc/homebrew

Please delete these paths and run:
  brew update

アップデートのコマンドは通りましたが、まだいくつかエラーが出ているようです。いくつかのパスがリンク切れになっているので削除してほしいみたいですね。では指示通り順に削除していきます。

rm -rf /usr/local/share/man/man1/brew.1
rm -rf /usr/local/share/doc/homebrew

削除したら`brew update`を実行してほしいみたいです。

brew update

実行したら以下が表示されました。

Installing from the API is now the default behaviour!
You can save space and time by running:
  brew untap homebrew/core
Already up-to-date.

「APIからのインストールがデフォルトの動作になりました!」とのこと。うまく行ったみたいです。
一緒に書いてあるコマンドを実行すればスペースと時間を節約できますと書いてあるので実行します。

brew untap homebrew/core
Untapping homebrew/core...
Untapped 3 commands and 6785 formulae (7,274 files, 599MB).

600MB近くアンタップ(homebrew/coreのリポジトリをアンインストール)できたので結構な容量を節約することができました。

結局アップデートはできたのか

アップデートがちゃんと実行できたか確認してみます。

brew --version
Homebrew 4.1.1

無事にアップデートできていました。一件落着です。

まとめ

Homebrew 4.0.0以前からアップデートを実行する際はエラーになると思いますが、落ち着いてエラー文を読み、順に対処していけば大丈夫!

ではでは〜