📖

gitconfigをremote repositoryごとに使い分ける

2022/07/24に公開

ざっくり

2022年4月ごろにリリースされたGit v2.36.0から, gitconfigのincludeIf sectionで新しい条件 hasconfig:remote.*.url が利用可能になりました. (release note)
これによって, trackingしているremote repositoryごとに動的に設定を変えることができるようになります.

基本的な使い方

例として, organizationqawatake-orgをtrackingしている && SSH接続を利用している場合に限り, ユーザ名をqawatakeQAWATAKEに変更するように設定してみます.

まず, .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に含めることができるようになります.

今回は, ユーザ名をqawatakeQAWATAKEに変更したいので, ~/.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