gitconfigをremote repositoryごとに使い分ける
ざっくり
2022年4月ごろにリリースされたGit v2.36.0から, gitconfigのincludeIf sectionで新しい条件 hasconfig:remote.*.url が利用可能になりました. (release note)
これによって, trackingしているremote repositoryごとに動的に設定を変えることができるようになります.
基本的な使い方
例として, organizationqawatake-orgをtrackingしている && SSH接続を利用している場合に限り, ユーザ名をqawatake→QAWATAKEに変更するように設定してみます.
まず, .gitconfigは↓のように記載します.
; デフォルトのユーザ名はqawatake
[user]
name = qawatake
; 条件付きincludeの設定
[includeIf "hasconfig:remote.*.url:git@github.com:qawatake-org/**"]
path = ~/.qawatake-org.gitconfig
[includeIf "hasconfig:remote..." の設定により, 作業中のプロジェクトが git@github.com:qawatake-org/** にマッチするようなremote urlを少なくとも1つtrackingしている場合に限り, ~/.qawatake-org.gitconfig をgit configに含めることができるようになります.
今回は, ユーザ名をqawatake→QAWATAKEに変更したいので, ~/.qawatake-org.gitconfig は↓のように記載します.
[user]
name = QAWATAKE
これによって, qawatake-orgをtrackingしているプロジェクト内ではユーザ名がQAWATAKE, それ以外のプロジェクトではqawatakeが適用されるようになります.
ちなみに, 今回は私がSSH接続を使っているためにgit@github.com:**形式のurlを使用しましたが, HTTPS接続を使いたい場合はhttps://github.com/**形式を利用すればよいです.
他にどんなパターンが使えるのか気になる場合は, テストコードを読んでみるといいかもしれません.
使い所
同じPC内に仕事用と趣味用のrepositoryがあり, それぞれで設定を変えたい場合に有用です.
例えば, ユーザメールアドレスを変えるなどでしょうか.
また, core.excludesfile sectionと組み合わせることで, 仕事用と趣味用でglobalなgitignoreを切り替えるといったことが可能になります.
通常globalなgitignoreを設定したい場合はcore.excludesfileではなくデフォルトの場所に記述する方がいいようですが. (~/.gitignore_global を指定するのをやめ、デフォルトの置き場に置こう)
ちなみに, clone元だけでなくfork元も条件の対象になるので, clone元のownerが自分であってもfork元が仕事のorganizationであれば, 仕事用の設定を反映させられます.
注意
hasconfig:remote.*.urlの書式を見るとあたかも*の部分をupstreamなどで置き換えられそうですが, 2022/07/24現在, hasconfig:remote.upstream.urlは有効ではありません.
Gitのドキュメントによると前方互換性のための書式のようです.
Discussion