GitHub と AWS CodeCommit を併用したり,プロジェクトごとに別アカウントを使ったり,リポジトリごとに git config を変える場面もある.今までは個人用 GitHub を global 設定とし,別アカウントはリポジトリごとに git config --local コマンドで設定をしていたけど,最近リポジトリが増えて,設定を忘れる場面もあり,direnv のように自動設定をする方法を探していた.
includeIf
Git Documentation を読むと,「Includes (include)」と「Conditional includes (includeIf)」の説明があり,なんと includeIf を使うと,設定ファイルを条件付きで読み込めるため,さっそく検証することにした.
検証環境
以下のように,ホームディレクトリ直下に github ディレクトリと codecommit ディレクトリを作成した.さらにサンプルリポジトリ g1 / g2 / c1/ c2 を作って git init をしておく.
~/github
├── g1
└── g2
~/codecommit
├── c1
└── c2
~/.gitconfig
今まで通り,ホームディレクトリに ~/.gitconfig を置き,GitHub 用に global 設定をしている.今回は user と email を抜粋した.さらに includeIf と gitdir を組み合わせて,~/codecommit/ 直下にあるリポジトリの場合に ~/.gitconfig_codecommit を読み込む設定を追加した.Git Documentation を読むと,gitdir 以外に onbranch なども使える.
[user] name = kakakakakku email = y.yoshida22@gmail.com [includeIf "gitdir:~/codecommit/"] path = ~/.gitconfig_codecommit
~/.gitconfig_codecommit
そして,条件付きで読み込む設定を ~/.gitconfig_codecommit に置く.今回は仮で bob と bob@example.com にした.
[user] name = bob email = bob@example.com
検証結果
global 設定を反映する github/g1 と github/g2 は今まで通りだった.
$ cd ~/github/g1 $ git config user.name kakakakakku $ git config user.email y.yoshida22@gmail.com $ cd ~/github/g2 $ git config user.name kakakakakku $ git config user.email y.yoshida22@gmail.com
そして codecommit/c1 と codecommit/c2 は,期待通りに bob になり,条件付きで読み込めていることを確認できた.便利だ!
$ cd ~/codecommit/c1 $ git config user.name bob $ git config user.email bob@example.com $ cd ~/codecommit/c2 $ git config user.name bob $ git config user.email bob@example.com
まとめ
プロジェクトごとに git config を読み替える場合は includeIf を使うと便利!特に git clone した直後にすぐ使えるのは体験として大きく改善した.小規模なら git config --local コマンドも引き続き併用していく.