brew updateでcouldn't find remote ref refs/heads/masterってエラー。Homebrewも万能じゃないんだね。

こんにちは。
フロントエンドエンジニアのみつです。

先日、朝イチでbrew updateがこけてしまって悩み、その解決までの日記です。

## 目次
- [起きたこと:cry:](#起きたことcry)
- [tap, untapって何:worried:](#tap-untapって何worried)
  - [`brew tap` means...](#brew-tap-means)
  - [`brew tap --repair` means...](#brew-tap---repair-means)
  - [`brew untap` means...](#brew-untap-means)
- [言われた通り対応してみる:writing\_hand:](#言われた通り対応してみるwriting_hand)
- [まとめ](#まとめ)


## 起きたこと:cry:
> This is happening because the remote branch was renamed or deleted.

brew updateをしたところ、**couldn't find remote ref refs/heads/masterというブランチが見つからない**エラーに遭遇しました。

remote branchが変更されたり、削除された時に起こるそう。

今回は、Fetchingの際、heroku/brewが見つからなかったそう。

直すには、`brew tap --repair`をすると良いことも書かれていました。

```
❯ brew update

fatal: couldn't find remote ref refs/heads/master
Error: Fetching /opt/homebrew/Library/Taps/heroku/homebrew-brew failed!

Installing from the API is now the default behaviour!
You can save space and time by running:
  brew untap homebrew/core
  brew untap homebrew/cask
Updated 1 tap (homebrew/core).
==> Outdated Formulae
gettext                                 openssl@3                               pyenv                                   readline                                ruby-build

You have 5 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.

Error: Some taps failed to update!
The following taps can not read their remote branches:
  heroku/brew
  
This is happening because the remote branch was renamed or deleted.
Reset taps to point to the correct remote branches by running `brew tap --repair`
```

## tap, untapって何:worried:
これまで、`brew update`も`brew upgrade`で失敗したこともなかったのに加えて、brewはとりあえず簡単インストールのためのツールとしか考えていなかったので・・・

初めてみたコマンドだなぁ、何が起きるコマンドなんだろうなぁと思いながら調べてました。

:::note info
Tapsは、(Third-Party Repositories)の略らしい。
:::

### `brew tap` means...
> brew tap without arguments lists all currently tapped repositories.

`brew tap`は、現在タップされているすべてのリポジトリを一覧表示するコマンド。

現在の一覧は、下記でした。

```
❯ brew tap 
heroku/brew
homebrew/cask
homebrew/core
homebrew/services
```

### `brew tap --repair` means...
> brew tap --repair migrates tapped formulae from a symlink-based to directory-based structure. (This should only need to be run once.)

`brew tap --repair`は、タップした式をシンボリックリンクベースからディレクトリベースに移行するコマンドらしい。

一度だけ実行すればOK、とのこと。

### `brew untap` means...
> brew untap user/repo [user/repo user/repo ...] removes the given taps. The repositories are deleted and brew will no longer be aware of their formulae. brew untap can handle multiple removals at once.

与えられたタップを削除するコマンド。

brew untapは一度に複数の削除もOKとのこと。

https://github.com/Homebrew/brew/blob/master/docs/Taps.md

## 言われた通り対応してみる:writing_hand:
とりあえず言われた通りに、`brew tap --repair`をしたら、heroku/brewがしっかりmasterからmainに変更された。

```
❯ brew tap --repair
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 24 (delta 7), reused 22 (delta 7), pack-reused 0
Unpacking objects: 100% (24/24), 12.34 KiB | 485.00 KiB/s, done.
From https://github.com/heroku/homebrew-brew
 * [new branch]      main       -> origin/main
==> heroku/brew: changed default branch name from master to main!
```

一応、再度`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
  brew untap homebrew/cask
Updated 1 tap (heroku/brew).
No changes to formulae or casks.
```

Warnメッセージ的なものは出ているけど、res/heads/masterが見つからないエラーは解消されているみたい。

後で、untapすると容量と実行時間が節約されるという方も対応しようと思いますが、一旦は、`brew upgrade`も実行できて大満足。:relaxed:

これでいつも通りのHomebrewが復活です。

## まとめ
Homebrewもエラーでて万能じゃないのかぁと一瞬思ったんですが、コマンドでrepairするオプションがあったり、今回は書いていませんが`brew doctor`という問題を発見するコマンドもあるので「さっすがぁ」という気持ちでした。

エラーもちゃんと読めば書いてあるな、と改めて。

もっと色んなエラーに巡り合いたいなと思いました。

おわり。