💭

direnvでhost名変えずに簡単にGithubアカウントを複数自動使い分け + ghコマンドも対応

2023/09/19に公開

結論

自分はこんな感じの構成にしてます。

  1. globalに普通に自分のprivate repositoryの設定をしておく
  2. 会社用のアクセスになるディレクトリを掘る
  3. そのディレクトリに下記の.envrc置いておいてdirenvで自動読み込み
.envrc
export GIT_AUTHOR_NAME=アカウント名
export GIT_AUTHOR_EMAIL=メールアドレス
export GIT_SSH_COMMAND="ssh -F $(pwd)/.ssh/config"
export GIT_COMMITTER_NAME=アカウント名
export GIT_COMMITTER_EMAIL=メールアドレス
export GH_CONFIG_DIR=$(pwd)/.gh
.ssh/config
Host github.com
    HostName github.com
    IdentityFile 秘密鍵
    User アカウント名
.gh/hosts.yml
github.com:
    user: アカウント名
    oauth_token: トークン
    git_protocol: ssh

解説

複数使い分けについて調べるとディレクトリに応じて.gitconfigでホスト名変更 → ホスト名に応じてssh/configで鍵変更で対応している例が多数出てきます。
この方法は

  • 複数ファイル書き換えが必要で面倒
  • host名を各自変えることになるのでコマンドの共通化などの障壁になる
    などがあり辛いです。

でこの .gitconfig + ssh/config の挙動を direnv + GIT_SSH_COMMAND をに変えて便利にします。

direnv

.envrcを置いておくとその下のディクトリに移動したときに自動でsourceしてくれます。
再帰的に作用するのでa/.envrcはa/bなどに移動したときにも有効。venvを自動で読み込ませたりとかいろいろ便利。

GIT_SSH_COMMAND

GIT_SSH_COMMAND環境変数でgitが仕様するsshコマンドを変更できます。
ssh -F configファイルとすると$HOME/.ssh/configではなく指定したコンフィグファイルを読ませることができるので、direnvと組み合わせて特定のディレクトリ下で特定の鍵を利用という挙動が実現できます。

ghコマンド

めちゃくちゃ便利。gh pr create -wで現在のbranchからPR投げる画面をブラウザで開いたりとか。
git操作以外にもtokenを使ってgithubにアクセスする都合個別対応が必要になります。
GH_CONFIG_DIR環境変数で設定ファイルのパスを変えることでアカウントを切り替えます。

Discussion