direnv で環境変数を切り替えつつ、ghq + peco でディレクトリ移動をサクサクやりたい!の覚書
はじめに
僕は今まで、仕事で使ってるPC(Mac)と私用のPC(Windows)を完全に分けていたんですが、結構不便なこともある、というか正直毎回つなぎ替えるのがめんどくさくて、仕事用のMacでも色々できるようにしたいな〜と思ってました。
一番心配していたのは「何かしら間違えてGitHubに上げちゃいけないものあげたらどうしよう…?」だったんですが、 direnv を使って環境変数ごと変えちゃえばリスクは相当下がるだろうなと思ったので一旦準備だけしてみました。
ついでに、普段 ghq と peco を使ってサクサクディレクトリ移動しているのもそのまま活用したかったので、その辺もやってみました。
という内容を、いつか自分が見返したときのために書き残しておこうと思います。
予防線
ちゃんと調べれば(調べていれば)わかるだろう、ということばかり話してしまいますが、
正直に、今まで知らなかったので全部書いちゃいます。
direnvを入れて環境変数を切り替えてみる
これを参考にして、何も困ることなくできました。
念の為、僕の環境で やったことを書いておきます(覚書なので)。
$ brew install direnv
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の設定を切り替えてみる
この部分も、こちらを参考にして何も困らずできました。
export GIT_AUTHOR_NAME=<名前>
export GIT_AUTHOR_EMAIL=<email アドレス>
export GIT_SSH_COMMAND="ssh -i <パス>"
という具合です。
.gitconfig
に手を加えずとも、環境変数が優先されてくれるんですね。
試したこともなかったので、全然知りませんでしたし、そもそもこんな環境変数を見にいってるということも知らなかったです。便利。
ちなみに、この .envrc
が万が一外に漏れてもきっとよくないので、以下のようにしました。
.envrc
ちなみに、僕は過去に ssh-keygen
を脳死でやった結果、 $HOME/.ssh/id_rsa
を上書きしてしまって 色々と困った という経験があったので、今回はしっかり別で作りました。
$ mkdir new_ssh
$ cd new_ssh
$ ssh-keygen -f id_rsa_new
これで、 new_ssh
下に id_rsa_new
と id_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
にいる
というわけです。
これは単純に便利なので、オススメです。
確かこのあたりを参考にしました。
何が困ったか?
先程のエイリアスを見れば一目瞭然ですが、移動先のディレクトリは ghq root
に設定しているパスが基底(?)になっています。
お察しの通り、僕は $HOME/workspace
を ghq 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'
更に言うと、 .gitconfig
に root=
を追記すれば良いという話については、
下に書いた方が優先される というルールがあるらしく、結局エイリアスに使っている cd ghq root
の時点で可変ではないため無理でした。
(気になる方は、2つ以上書いた上で ghq root
と ghq root --all
を実行してみてください。多分前者では一番下に書いたパスが表示されます)
で、結局 .gitconfig の [ghq] root = ... より優先度の高い環境変数は何だ? というのが今回僕が気になった話ですが、 GHQ_ROOT
というのがあるっぽいです。
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