メインコンテンツにスキップ

環境ごとに異なるgit設定を適用する方法

· 3分の読み時間
Haril Song
Owner, Software Engineer at 42dot

TL;DR

  • includeIf構文を使用すると、特定の条件を満たすgit設定ファイルのみを適用できます。
  • 業務環境と個人環境を分離するのに便利です。

問題点

  • 業務用の開発環境と個人の開発環境が分かれています。
  • しかし、グローバルなgit configは個人環境を基準に設定しているため、chezmoiで設定ファイルを同期する際に、業務用の開発環境に個人の設定が上書きされてしまう問題がありました。
  • 業務環境と個人環境を安定して分離するにはどうすればよいでしょうか?

解決策

Gitには、このような場合に条件ごとに設定ファイルを切り替える方法が提供されています。それがincludeIfです。 includeはモジュール化のように外部ファイルをgit設定に含めるものですが、ここに条件式を適用することで、特定の条件を満たす場合にのみ設定ファイルが含まれるようにするのです。

一部の会社では、コミット時にメールアドレスと名前をチェックするルールがあるため、これを守らないとコミットできません。

# ~/projects/company
git config --get user.email
# songkg7@gmail.com <- 会社のメールアドレスではなく、個人のアカウントのメールアドレスが設定されている場合、コミットは拒否されます。

user.nameuser.emailが会社のアカウントとして設定されるように構成してみましょう。まず、~/.gitconfig-workというファイルを作成し、次のように必要な設定を定義しました。

# ~/.gitconfig-work
[user]
name = kyungkeun.song
email = kyungkeun.song@42dot.ai
# ~/.gitconfig OR ~/.config/git/config
[includeIf "hasconfig:remote.*.url:git@ssh.gitlab.42dot.ai:**/**"]
path = ~/.gitconfig-work

[includeIf "gitdir:~/projects/42dot/"]
path = ~/.gitconfig-work

上の設定は、git remoteのパスが定義されたパスに設定されている場合に~/.gitconfig-workの設定を含めます。下の設定はディレクトリベースの設定で、gitが呼び出されるパスが定義されたディレクトリ内であれば~/.gitconfig-workの設定を含めます。両方の設定を一緒に定義して、万が一のルール違反が発生しないように設定しました。

メモ

個人的には、HOMEディレクトリに設定ファイルが散らかっているのが好きではないので、~/.config/以下のパスに設定することを好みます。

その後、定義されたパスのgitディレクトリにアクセスしてuser.nameまたはemailを確認すると、

.gitフォルダが作成される前は個人の設定が適用され、.gitフォルダが作成された瞬間にincludeIfが動作して業務用の設定が適用されることが確認できます。

結論

在宅勤務を許可している会社では、やむを得ず個人の機器で業務を行う場合がありますが、そのような場合に便利に利用できるでしょう。