[小ネタ]direnvでGitブランチごとに環境変数を切り替える

direnvで環境変数を設定している環境でGit Hook post-checkoutとトリガーに環境変数のロードをすることでブランチごとに環境変数の値の切り替えができます。
2021.02.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ディレクトリごとに環境変数を設定、管理できるdirenv はそれだけでも非常に便利ですが、今回はチェックアウトしているGitブランチごとに環境変数の値を変更できないか試してみたのでその方法を紹介します。

必要なもの

  • direnv
  • Git

方針

方針は以下の通りです。

  • direnvを使ってチェックアウトしているブランチ名に応じて環境変数の値を変更する
  • git post-checkout hookでdirenv allowして環境変数を更新する

実際のスクリプトは以下のようになります。

.envrc

# ブランチ名にspecial_branch が含まれる場合はsecretの値を変更する
if git branch --show-current | grep 'special_branch' > /dev/null; then
  export my='mop-cc-app-api-dev'
else
  export pz_client_id='mop-api-itg-test'
fi

.git/hooks/post-checkout

#!/usr/bin/env bash
direnv allow .

使用例

以下の例ではmainからspecial_branchに切り替えることで変数 my_secret の値が変わっていることがわかります。

## mainブランチの場合
$ git checkout main
Already on 'main'
direnv: loading ~/tmp/direnv_on_git/.envrc
direnv: export +my_secret

$ env | grep my_secret
my_secret=usual_secret

## special_branchに切り替え

$ git checkout -b special_branch
Switched to a new branch 'special_branch'
direnv: loading ~/tmp/direnv_on_git/.envrc
direnv: export +my_secret

$ env | grep my_secret
my_secret=another_secret

まとめ

Git hookとdirenvを使ってブランチごとに環境変数の値を変更できました。