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してしまう人は設定しておきましょう。