July 11, 2018

Gitでリポジトリ毎に異なるアカウントを使う

Motivation

開発をしていると会社用のGitHubアカウントと個人のGitHubアカウント等 複数アカウントを使い分けたくなると思います。
リポジトリ毎に
$ git config --local user.name hoge
$ git config --local user.email hoge@gmail.com
する方法もありますが、リポジトリが複数あると、configをせずにcommitしてしまって、 pushした後にGithubのページ上で間違えに気づき、authorを上書きしてcommitし直す経験をした人はいるのではないでしょうか。

Config

Git v2.13.0 (2017/05 release) からincludeIf という条件式がgitconfigで使えるようになりました。

[includeIf "条件"] このように記述すると条件を満たす場合のみ設定を反映することが出来ます。

.gitconfig

.gitconfigに以下の文を書きます。

[includeIf "gitdir:~/src/hoge/"]
  path = ~/src/hoge/.gitconfig

gitdir はディレクトリを表します。 この場合だと、ディレクトリが ~/src/hoge/ の場合に、~/src/hoge/ にある .gitconfig を適用します。 条件式のpathの最後に / をつけると、子のディレクトリを含めて再帰的に反映されます。 pathの中身は何でも良いので、設定ファイルはrootディレクトリにまとめて置いておいてもいいかもしれません。

これを .gitconfig に記述すれば、会社用のリポジトリがあるフォルダのみ、会社用のGitアカウントを適用することが出来ます。

.gitconfig.localでproxyする

簡単なpathなら上記の設定でめでたしめでたし。なのですが、 goで開発をしていたりすると、ディレクトリ名にgitのhost情報が入って来ます。
弊社はGHEを使用しているので、あまりgitconfigにはhost情報を載せたくありません。 私はdot filesをGitHubで管理しているので、privateな情報はpushしないようにしたいです。 そこで、.gitconfig.local というファイルを追加してディレクトリ情報が載ったconfigは .gitconfig.local に記述して、各リポジトリ毎に .gitconfig を追加します。 globalの .gitconfig では include のみをすれば、Host情報を隠したままgitconfigの内容を適用出来ます。

  • .gitconifg
[include]
    path = ~/.gitconfig.local
  • .gitconfig.local <= commitしない
[includeIf "gitdir:~/src/hoge/"]
  path = ~/src/hoge/.gitconfig

子ディレクトリ全てに適用する場合には、pathの最後に / をつけます

  • ~/src/hoge/.gitconfig <= commitしない
[user]
  name = foo
  email = hoge@gmail.com

よくauthorを間違えてcommitしてしまう人は設定しておきましょう。

© AAkira 2018