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