📝

direnv で環境変数を切り替えつつ、ghq + peco でディレクトリ移動をサクサクやりたい!の覚書

2022/06/06に公開

はじめに

僕は今まで、仕事で使ってるPC(Mac)と私用のPC(Windows)を完全に分けていたんですが、結構不便なこともある、というか正直毎回つなぎ替えるのがめんどくさくて、仕事用のMacでも色々できるようにしたいな〜と思ってました。

一番心配していたのは「何かしら間違えてGitHubに上げちゃいけないものあげたらどうしよう…?」だったんですが、 direnv を使って環境変数ごと変えちゃえばリスクは相当下がるだろうなと思ったので一旦準備だけしてみました。

ついでに、普段 ghqpeco を使ってサクサクディレクトリ移動しているのもそのまま活用したかったので、その辺もやってみました。

という内容を、いつか自分が見返したときのために書き残しておこうと思います。

予防線

ちゃんと調べれば(調べていれば)わかるだろう、ということばかり話してしまいますが、
正直に、今まで知らなかったので全部書いちゃいます。

direnvを入れて環境変数を切り替えてみる

これを参考にして、何も困ることなくできました。
https://qiita.com/kompiro/items/5fc46089247a56243a62

念の為、僕の環境で やったことを書いておきます(覚書なので)。

$ brew install direnv
$HOME/.zshrc
export EDITOR=vim
eval "$(direnv hook zsh)"
$ mkdir new_workspace
$ cd new_workspace
$ direnv edit .

出来上がった $HOME/new_workspace/.envrc に環境変数に対する操作を色々やって、

$ direnv allow

これに関しては、いじる度に
direnv: error ~/new_workspace/.envrc is blocked. Run direnv allow to approve its content
と出るので忘れることはなさそうです。

ちなみに一度設定をしてしまえば、このディレクトリに移動するたびに、
direnv: loading ~/new_workspace/.envrc
direnv: ${指定した内容}
みたいな感じで出してくれるので、優しいな〜と思いました。

この .envrc で、 export HOGE=111 だったり、 絶対に何が何でもこのディレクトリにいる間は見なくていい環境変数unset FUGA としたりするわけですな多分。便利。

このディレクトリ下でGitの設定を切り替えてみる

この部分も、こちらを参考にして何も困らずできました。
https://genzouw.com/entry/2021/08/04/153026/2750/

$HOME/new_workspace/.envrc
export GIT_AUTHOR_NAME=<名前>
export GIT_AUTHOR_EMAIL=<email アドレス>
export GIT_SSH_COMMAND="ssh -i <パス>"

という具合です。
.gitconfig に手を加えずとも、環境変数が優先されてくれるんですね。
試したこともなかったので、全然知りませんでしたし、そもそもこんな環境変数を見にいってるということも知らなかったです。便利。

ちなみに、この .envrc が万が一外に漏れてもきっとよくないので、以下のようにしました。

~/.config/git/ignore
.envrc

ちなみに、僕は過去に ssh-keygen を脳死でやった結果、 $HOME/.ssh/id_rsa を上書きしてしまって 色々と困った という経験があったので、今回はしっかり別で作りました。

$ mkdir new_ssh
$ cd new_ssh
$ ssh-keygen -f id_rsa_new

これで、 new_ssh 下に id_rsa_newid_rsa_new.pub が作られました。便利。

ghq + peco でサクサク移動したい!

これに関しては、多分 本当に僕のせい なんですが、今回のやり方だとちょっとだけ面倒なことになりました。

とりあえず、ghq と peco で何をしていたか?

alias g='cd $(ghq root)/$(ghq list | peco)'

で、 g を実行するだけで ghq root に設定しているディレクトリ下の(ローカル)リポジトリのディレクトリに移動できるようにしてました。

僕は基本的に全てのコードを $HOME/workspace 下に入れていたので、例えば$HOME/workspace/hoge/fuga-rep というのをいじりたいときには、

g を実行する

fug くらいまで打つ

候補として fuga-rep が出てきたら Return を押す

カレントディレクトリが今どこだろうと、次の瞬間には $HOME/workspace/hoge/fuga-rep にいる

というわけです。
これは単純に便利なので、オススメです。
確かこのあたりを参考にしました。
https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2

何が困ったか?

先程のエイリアスを見れば一目瞭然ですが、移動先のディレクトリは ghq root に設定しているパスが基底(?)になっています。
お察しの通り、僕は $HOME/workspaceghq root に設定していました。

そして僕が今回 direnv を使って環境を切り替えようとしたディレクトリのパスは、 $HOME/new_workspace です。

つまり、このままだと少なくとも何があっても $HOME/workspace/hoge/fuga にしか移動できないので、 new_workspace 下には移動することができません。
かといって、ホームディレクトリをルートにしてしまうと、全てのディレクトリを探索されちゃうので、遅いでしょうし、色々と権限も与えることになるでしょうし、なんとなく気持ちがよくありませんでした。

ghq root は、 .gitconfig に以下のように定義されていました。

[ghq]
  root = ~/workspace

ここから先は色々な戦略があるかもしれませんが、僕としては 「Gitと同じように、.gitignoreより環境変数が優先されるならそれが一番よくね?」 という気持ちだったので、その戦略を取りました。
(もし、もっと手っ取り早い方法があるよって方いらっしゃいましたら、教えていただきたいです)

ちなみに、エイリアスを張るときに ghq look を使うという戦略も見つけたんですが、どうやら今それはできないっぽいです。

前はあったサブコマンドで、今は廃止されたとかなんですかね?

$ ghq look
No help topic for 'look'

更に言うと、 .gitconfigroot= を追記すれば良いという話については、
下に書いた方が優先される というルールがあるらしく、結局エイリアスに使っている cd ghq root の時点で可変ではないため無理でした。
(気になる方は、2つ以上書いた上で ghq rootghq root --all を実行してみてください。多分前者では一番下に書いたパスが表示されます)

で、結局 .gitconfig の [ghq] root = ... より優先度の高い環境変数は何だ? というのが今回僕が気になった話ですが、 GHQ_ROOT というのがあるっぽいです。

$HOME/new_workspace/.envrc
export GHQ_ROOT="new_rep_dir"

というわけで、上記のようにすることで new_workspace/ 下にいるときには、

$ pwd
~/new_workspace
$ ghq root
~/new_workspace/new_rep_dir

のようにすることができました。

これで、 new_workspace/ 下にいるときには、その中のローカルリポジトリのみが g での検索対象になり、逆にそれ以外のときは new_workspace/ は検索対象にならない、ということになりました。

おわりに

特に ghq + peco の話をするのであれば、多分以下のようになっていれば、 ghq root$HOME/src にすればいいだけの話でしたね。

$HOME/
┗src/
  ┣ 仕事dir/
  ┗ 私用dir/

とはいえ、そうしなかったことによって色々と知見が得られたという側面もあるので、一旦よしとしておきたいです。

Discussion