ghqとgitconfigのincludeIfでリポジトリサーバーごとに設定を切り替える

この記事はGMOペパボエンジニア Advent Calendar 2021 11日目の記事です。

首の調子が悪くて整体に電話をかけたら「画面を見るな」と言われたので、書きかけの記事を慌てて引っ張り出してネタにします。皆様も良い姿勢で画面と向き合いましょう。


GMOペパボではGitHub Enterprise Server(以下GHES)を使用してコードを管理しています。GHESのアカウントはgithub.comのアカウントとは別になるので、 git configのUser設定を切り替える必要があります。この作業は何もしなければ、git cloneごとに必要な作業で忘れると、意図しないアカウントでコミットが詰まれpushされる可能性があります。

これはめんどくさいので勝手に切り替わるようにします。要件は以下のとおりです。

  • それぞれのリポジトリのuser設定は別にしたい
  • GHESのホスト名をdotfilesの管理下に含めない

前提

コード管理を行なっているGHES のホスト名を ghes.example.com とします。

方法

ghqを使ってリポジトリを管理する

ghqを使うことでリポジトリのクローン先をホストごとに分けることができます。

Songmu/ghq-handbook に詳しい利用方法が記載されています。

ghq get コマンドでリポジトリを取得することによって、 gitconfigの ghq.root に設定されたディレクトリ以下にリポジトリがクローンされるようになります。

gitconfigを設定する

以下の設定を書きます。

~/.gitconfig

これだけdotfilesのコード管理に含めます。

# $ cat ~/.gitconfig
[user]
  name = github_user
  email = github_user@example.com

[include]
  path = ~/.config/git/local.gitconfig

[ghq]
  root =~/src

~/.config/git/ 以下

以下はコード管理下に置きません。

~/.config/git
├── ghes.example.com.gitconfig
└── local.gitconfig
# $ cat ~/.config/git/local.gitconfig
[IncludeIf "gitdir:~/src/ghes.example.com/"]
  path = ~/.config/git/ghes.example.com.gitconfig
# $ cat ~/.config/git/ghes.example.com.gitconfig
[user]
  name = ghes_user
  email = ghes_user@example.com

IncludeIf で特定のディレクトリの下でのみgitconfigを適用できるので、それを利用してuser設定を切り替えます。これにより、 ~/src/ghes.example.com/ の下のディレクトリで ~/.config/git/ghes.example.com.gitconfig の設定を適用させることができます。 local.gitconfig を挟んでいるのは、 IncludeIf の設定でGHESのホスト名を含んだ設定を行う必要があるためです。気にしないのであれば、回りくどいことをせずにgitconfigに直接書くのが良いと思います。また、個人的にはgithub.comのアカウント情報がGHESにコミットされた方がダメージが低いので、globalのuser設定ではgithub.comのアカウント情報を設定し、GHESのリポジトリの上で設定を上書きするようにしています。

参考