kakakakakku blog

Weekly Tech Blog: Keep on Learning!

includeIf を使って git config をプロジェクトごとに読み替える

GitHub と AWS CodeCommit を併用したり,プロジェクトごとに別アカウントを使ったり,リポジトリごとに git config を変える場面もある.今までは個人用 GitHub を global 設定とし,別アカウントはリポジトリごとに git config --local コマンドで設定をしていたけど,最近リポジトリが増えて,設定を忘れる場面もあり,direnv のように自動設定をする方法を探していた.

includeIf

Git Documentation を読むと,「Includes (include)」「Conditional includes (includeIf)」の説明があり,なんと includeIf を使うと,設定ファイルを条件付きで読み込めるため,さっそく検証することにした.

git-scm.com

検証環境

以下のように,ホームディレクトリ直下に github ディレクトリと codecommit ディレクトリを作成した.さらにサンプルリポジトリ g1 / g2 / c1/ c2 を作って git init をしておく.

~/github
    ├── g1
    └── g2
~/codecommit
    ├── c1
    └── c2

~/.gitconfig

今まで通り,ホームディレクトリに ~/.gitconfig を置き,GitHub 用に global 設定をしている.今回は useremail を抜粋した.さらに includeIfgitdir を組み合わせて,~/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 に置く.今回は仮で bobbob@example.com にした.

[user]
  name = bob
  email = bob@example.com

検証結果

global 設定を反映する github/g1github/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/c1codecommit/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 コマンドも引き続き併用していく.