hub でディレクトリごとに GitHub アカウントを使い分ける方法


TL;DR

  • hub 2.x 以降, 設定ファイルは環境変数 GH_CONFIG を参照している
  • これをディレクトリごとに切り替えるために direnv を入れる
  • 切り替えたいディレクトリで echo export GH_CONFIG=$(pwd)/.hub > .envrc しておきあとは hub を普通に使うだけ

hub でディレクトリごとに GitHub アカウントを使い分ける

仕事と自宅で別の GitHub アカウントを使う場合など, hub が store しておく token を複数持ちたい場合がありますよね.
そんなときに, 以下の方法を取るとディレクトリごとに任意の GitHub token を選択することができ, 公開リポジトリにうっかり会社のアカウントで hub pull-request して失敗することがなくなります.

方法

以下は golang で書かれた hub 2.x の話になるので, まず hub 2.x を入れます.

brew install --HEAD hub

hub は取得した token を ~/.config/hub に保存します. そこの処理を見てみましょう.

hub/config.go

func configsFile() string {
    configsFile := os.Getenv("GH_CONFIG")
    if configsFile == "" {
        configsFile = defaultConfigsFile
    }

    return configsFile
}

defaultConfigFile は defaultConfigsFile = filepath.Join(os.Getenv("HOME"), ".config", "hub") と定義されています. これが ~/.config/hub なのですが, 環境変数 GH_CONFIG がそれに先んじて参照されているため, GH_CONFIG に適当なファイルパスを指定しておけば良さそうです.

こういうときに便利なのが direnv です.

zimbatm/direnv

導入方法と紹介は以下の記事に詳しくあります.

direnvを使おう - Qiita

これは, ディレクトリごとに任意の環境変数を設定できる優れものです.
今回の場合だと GitHub アカウントを変えたいディレクトリで,

echo export GH_CONFIG=$(pwd)/.hub > .envrc

とすると, ディレクトリ直下に .envrc ができ環境変数 GH_CONFIG が読み込まれます. あとは hub pull-request すると user_name, password を聞かれるので, 設定したいアカウント情報を入力するとそのアカウントで Pull Request が作成されます

今回の設定だと .hub に GitHub token が保存されます. 間違って commit に含まれないように .hub を共通の .gitignore に追加しておきましょう. また, このやり方だと毎回 token を生成してしまうので, ~/.config/hub_second などのようにアカウントごとに特定の名前を付けるようにして,

echo export GH_CONFIG=$HOME/.config/hub_second > .envrc

というふうに生成するのも良いでしょう.