🪬

リポジトリ毎の Git ユーザー情報を自動で切り替える

2023/12/02に公開

この記事は ミライトデザイン Advent Calendar 2023 の 2 日目の記事です。

はじめに

Git を使っていると個人や会社、その他クライアントなどでリポジトリのユーザー名・ユーザーアドレスを切り替えたいことがよくあります。

リポジトリ毎に config 設定をすれば良いのですが、設定をし忘れてグローバルに設定している自分のアドレスでコミットしてしまったということはありませんか。

今回はリポジトリ毎に設定を自動で切り替える方法を紹介します。

リポジトリごとの設定を強制する

useConfigOnly という設定を true にしておくことで、グローバルも含め user.nameuser.email を指定していないとコミットできなくなります。

❯ git config --global user.useConfigOnly true

ただし、グローバルの設定があるとそれを使用するようになるため、リポジトリ毎で明示的に指定したい場合は、グローバルの設定を削除してリポジトリ毎で都度設定させるようにします。

❯ git config --global --unset user.email
❯ git config --global --unset user.name

これらの設定をした上で、ユーザー設定をしていないリポジトリでコミットをしようとすると下記のエラーが表示されるようになり、設定し忘れに気づくことができるようになりました。

❯ git commit -m "first commit"
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: no email was given and auto-detection is disabled

ディレクトリ単位で config を自動で切り替える

設定を強制させることでリポジトリ毎のユーザー設定を間違えることはなくなりましたが、都度リポジトリへ設定することになるので少々面倒です。

そこで gitconfig で設定できる includeIf というのを使って、ディレクトリ単位でアカウントを切り替えるようにします。

includeIf は、gitconfig 内において使用できる機能で、特定の条件が満たされたときに特定の設定を適用できます。

例えば、個人用(private)と仕事用(works)が以下のようなディレクトリで別れているとします。

~/
├── private
└── works

private には個人用の情報で、 works には仕事用の情報を設定するとした場合、下記の config ファイルを作成します。

~/
├── .gitconfig           # グローバルの config ファイル
├── .gitconfig-private   # 個人用の config ファイル
└── .gitconfig-works     # 仕事用の config ファイル

それぞれ設定したい情報を各設定ファイルに追記します。

.gitconfig-private
[user]
  name  = private-user
  email = private-user@example.com
.gitconfig-works
[user]
  name  = company-user
  email = company-user@company.example.com

そして、 .gitconfigincludeIf を使って作業ディレクトリ毎に読み込むファイルを設定します。

.gitconfig
[user]
  [includeIf "gitdir:~/private/"]
    path = ~/.gitconfig-private
  [includeIf "gitdir:~/works/"]
    path = ~/.gitconfig-works

これで、指定したディレクトリ配下のリポジトリは、適用された config のユーザー情報で設定されるようになりました。

private 配下のリポジトリで user.name と user.email を確認すると意図した設定となっていることが確認できます。

❯ cd ~/private/private-test/
❯ git config user.name
private-user
❯ git config user.email
private-user@example.com

works 配下のリポジトリも同様に確認できました。

❯ cd ~/works/works-test/
❯ git config user.name
company-user
❯ git config user.email
company-user@company.example.com

例外的に特定のリポジトリだけ情報を変えたい場合は、通常通り local の gitconfig を設定することで上書きされるため問題ありません。

❯ cd ~/works/works-test/
❯ git config user.name "company-user-1"
❯ git config user.email
company-user-1

これで、リポジトリ毎に設定せず、指定したディレクトリ配下のユーザーが自動切り替えされるようになりました。

まとめ

今回は、 useConfigOnly 設定を使用してユーザー設定の強制をし、 includeIf 設定を使用してディレクトリ単位でユーザー情報を自動で切り替える方法について紹介しました。

これにより、リポジトリ毎にユーザー設定する手間を省き、設定のミスを防ぐことができます。

Git は開発をしていれば使用することが多いと思うので、是非この設定を参考にしてストレスフリーになってみてください。

Discussion