Homebrew.jl で git 周りのエラーに遭遇したときの対処法

## TL;DR

+ Homebrew.jl でエラーが出たら以下の2つを試す：
    + `Homebrew.jl` のパッケージディレクトリを手動で物理削除して、再インストールする
    + 別途 Homebrew で入れていた（システムの）git をアップグレードする

### 環境

+ Mac OSX 10.11.6 El Capitan[^elcapitan][^upgrade_sierra_or_later]
+ Julia v0.6.1
+ git v2.x.x（Homebrew でインストール → `/usr/local/bin/git`）

[^elcapitan]: おそらく Sierra/High Sierra でも同様です（ていうかまだ Sierra 以降にアップグレードしてなかったりする…）
[^upgrade_sierra_or_later]: （ていうか Sierra 以降にアップグレードしたら同じ問題がまた起きそうな気がする…）

## 改めて説明

macOS で Julia 使ってて、色々な外部パッケージをインストールしてると、パッケージによっては `Homebrew.jl` に依存していていつの間にかインストールされたりします。
そしてこれが、長く使ってるとエラーが出ることがよくあります。どのようなエラーなのかというと、状況としてはパッケージのアップデート時や他のパッケージインストール時、エラーの種類は、git 関連。

最近遭遇したエラーと、それをどう解決したかのメモを残しておきます。
全ての人に当てはまるとは限りませんが、誰かの何かしらの参考になれば。

## ケース1

以下のようなエラーが出ることがありました。

```jlcon
julia> Pkg.build("Homebrew")
INFO: Building Homebrew
 : 《中略》
Error: git: /path/to/userhome/.julia/v0.6/Homebrew/deps/usr/Library/Taps/homebrew/homebrew-core/Formula/git.rb:190: syntax error, unexpected $undefined, expecting keyword_end
      \thelper = osxkeychain
       ^
==============================[ ERROR: Homebrew ]===============================

LoadError: ArgumentError: `brew info` failed for String["git"]!
while loading /path/to/userhome/.julia/v0.6/Homebrew/deps/build.jl, in expression starting on line 2

================================================================================

================================[ BUILD ERRORS ]================================

WARNING: Homebrew had build errors.

 - packages with build errors remain installed in /path/to/userhome/.julia/v0.6
 - build the package(s) and all dependencies with `Pkg.build("Homebrew")`
 - build a single package by running its `deps/build.jl` script

================================================================================

julia> 

```

つまり Homebrew.jl のビルド時に「`` `brew info` `` が失敗する」というもの。
「パッケージをビルドし直すには `Pkg.build("Homebrew")` してみてね」と言われるんですけれど、何度実行しても同じエラーが出ます。

### 解決策

よく分からないのですが、このエラーが出たら「最初から作り直す」のが正解っぽいです。
参考→ https://github.com/JuliaPackaging/Homebrew.jl/issues/206

手順としては以下：

+ パッケージディレクトリ内の、`Homebrew` ディレクトリを（物理）削除する。
    + 通常、ユーザホームディレクトリ直下の `.julia/v0.6/Homebrew/` となります。
+ Julia の REPL に戻って、`Pkg.update()` を実行する。
    + 依存関係から `Homebrew.jl` を再インストール・再ビルドしてくれる。

```sh
$ cd ~/.julia/v0.6
$ rm -rf Homebrew
```

```jlcon
julia> Pkg.update()
INFO: Updating METADATA...
 : 《中略》
INFO: Installing Homebrew v0.5.9
INFO: Building Homebrew
INFO: Downloading brew...
 : 《後略》

julia>

```

何事もなく完了すればOK。

## ケース2

なんかもっとやばそうな「`git` コマンドがそもそもまともに動いてなさそう」なエラー↓が出る場合もありました。

```jlcon
julia> Pkg.build("Homebrew")
INFO: Building Homebrew
fatal: Unable to find remote helper for 'https'
fatal: Unable to find remote helper for 'https'
Error: Fetching /path/to/userhome/.julia/v0.6/Homebrew/deps/usr failed!
Fetching /path/to/userhome/.julia/v0.6/Homebrew/deps/usr/Library/Taps/homebrew/homebrew-core failed!
git: 'rebase' is not a git command. See 'git --help'.
git: 'rebase' is not a git command. See 'git --help'.
==============================[ ERROR: Homebrew ]===============================

LoadError: failed process: Process(`/path/to/userhome/.julia/v0.6/Homebrew/deps/usr/bin/brew update --force`, ProcessExited(1)) [1]
while loading /path/to/userhome/.julia/v0.6/Homebrew/deps/build.jl, in expression starting on line 2

================================================================================

================================[ BUILD ERRORS ]================================

WARNING: Homebrew had build errors.

 - packages with build errors remain installed in /path/to/userhome/.julia/v0.6
 - build the package(s) and all dependencies with `Pkg.build("Homebrew")`
 - build a single package by running its `deps/build.jl` script

================================================================================

julia>

```

実際に `git --help` するとちゃんと `rebase` はちゃんとあるのに、このエラーが出る。

### 解決策

この場合は、私が別に Homebrew でインストール[^system_homebrew]していた `git` の側に問題があったようで、そちらをアップグレードしたら治りました。

[^system_homebrew]: `/usr/local/〜` 以下で各種コマンドや shared library を管理する（システムレベルの）Homebrew と、Julia で管理している Homebrew とが混在（しかも複数バージョン Julia インストールしていたり JULIA_PKGDIR 指定して環境を分けている場合はさらに複数存在）していると、色々めんどくさいことになります…。

参考→ https://github.com/JuliaPackaging/Homebrew.jl/issues/211#issuecomment-347919388

```jlcon
shell> brew upgrade git
Updating Homebrew...
==> Auto-updated Homebrew!
 : 《中略》
==> Upgrading 1 outdated package, with result:
git 2.15.1
==> Upgrading git
==> Downloading https://homebrew.bintray.com/bottles/git-2.15.1.el_capitan.bottl
Already downloaded: /path/to/userhome/Library/Caches/Homebrew/git-2.15.1.el_capitan.bottle.tar.gz
==> Pouring git-2.15.1.el_capitan.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.15.1: 1,488 files, 34.4MB

julia> Pkg.build("Homebrew")
INFO: Building Homebrew
Already up-to-date.

julia> 

```

## まとめに変えて

これでやっと眠れる…。