はじめに
Github を使って複数のプロジェクトを兼任していると、Git の複数アカウントを切り替えて使う必要がある場合があります。
僕は諸事情により Github アカウントを仕事用 x2、個人用 x1 を所有しています。
よく知られている方法としては、
以下のように git config --local コマンドで切り替えるやり方があります。
| |
こういったマルチアカウント利用ケースにて、 環境変数を使って Git の ユーザ名(username) 、 e-mail(email) 、 SSH KEY の切り替え作業を効率化するための方法について紹介します。
検証環境
| |
前提条件(必要なツール)
今回は direnv というツールを利用することを前提としています。
direnv については、過去のエントリでも紹介しているのでぜひご参考ください。
Git の挙動は「環境変数」を使って変更できる
Git の設定といえば git config コマンドを使ったり ~/.gitconfig ファイルを編集したりといった方法がよく利用されます。
上記以外にも、シェルの 環境変数 を使って動作を変更することができます。
今回利用する環境変数は以下の 3 つになります。
GIT_AUTHOR_EMAILGIT_AUTHOR_NAMEGIT_SSH_COMMAND
それでは早速、direnv と 上記の環境変数を使った設定の自動切り替えのやり方について見ていきましょう。
~/gitconfig から設定を読み込む (デフォルトの挙動)
git commit を何度か実行し、コミット時の username と email がどのように変わっていくかをお見せしたいと思います。
まずは適当な作業ディレクトリを作成した後、Git のローカルリポジトリを作成します。
| |
ここからファイルを追加し、コミットしてみます。
まずは 1 つめのファイルを追加します。
| |
正常にコミットされました。
ログを確認すると、 username = genzouw 、 email = genzouw@gmail.com となっていることがわかります。
この設定は僕の ~/.gitconfig ファイルに設定されている内容であり、デフォルトの挙動となります。
| |
環境変数から設定を読み込む
今度は git commit 実行前に GIT_AUTHOR_NAME、 GIT_AUTHOR_EMAIL の 2 つの環境変数を設定してみます。
それぞれ genzouw2 、 genzouw2@gmail.com という値を設定しています。
$ export GIT_AUTHOR_NAME=genzouw2
$ export GIT_AUTHOR_EMAIL=genzouw2@gmail.com
2 つめのファイルを追加し、コミットしてみます。
| |
コミット時のメッセージからもすでにわかりますが、
ログを確認すると、 username = genzouw2 、 email = genzouw2@gmail.com となっていることがわかります。
~/.gitconfig ファイルに設定されている内容を利用せず、先程設定した環境変数が利用されていることがわかります。
$ git log
commit 9e196fc761489dae0b355cb1b877b14980dea3ec (HEAD -> main)
Author: genzouw2 <genzouw2@gmail.com>
second commit.
commit 5ffe0d71e21a80161387c8beb8c23ad30f21cd9a
Author: genzouw <genzouw@gmail.com>
first commit.
ローカルリポジトリのディレクトリに移動したときに自動的に環境変数が適用されるようにする
毎回 GIT_AUTHOR_NAME、 GIT_AUTHOR_EMAIL の 2 つの環境変数を設定したり、解除したりは面倒です。
そこで direnv を利用します。
direnv がインストールされていると、
.envrc というファイルが置かれているディレクトリ配下(サブディレクトリでも OK)に cd で移動したタイミングで .envrc に書かれている環境変数が自動的に適用されます。
逆にこのディレクトリ配下から抜け出すと環境変数が unset されます。
再び、2 つの環境変数 GIT_AUTHOR_NAME、 GIT_AUTHOR_EMAIL に新しい値を設定した後、コミットしてみたいと思います。
ただし、環境変数は .envrc ファイルに記述することにします。
また、値はそれぞれ genzouw3 、 genzouw3@gmail.com とします。
| |
3 つめのファイルを追加し、コミットしてみます。
| |
ログを確認します。 コミットした際のユーザ名、メールアドレス は想定した値になっています。
| |
.envrc ファイルを無視リストに追加しておく
git status 、 git diff 実行時に毎回 .envrc ファイルがステージング前のファイルとして検出されると煩わしいです。
そこで、 .envrc ファイルを Git のグローバル無視リストとして設定しましょう。
| |
git push 時に利用する SSH KEY も切り替える
git commit までは自動的に切り替える仕組みができました。
最後に git push 実行時に利用する SSH KEY も自動的に切り替わるようにしましょう。
GIT_SSH_COMMAND 環境変数を指定すると、git push を実行したときに内部で使われる ssh コマンドにオプションを指定することができます。
以下のように ssh コマンドに -i オプションを付与し利用したい秘密鍵を指定します。
| |
この状態で git push すると、 普段利用されている ~/.ssh/id_rsa や ~/.ssh/config の設定に優先して環境変数に指定した鍵が利用されます。
ひとこと
git push したときに利用するSSH KEYをなんとかしたい場合に便利です。