Open9

[Git] 個人用PCで複数のリモートサーバやアカウントの違いを吸収するためのいつものconfigメモ

ピン留めされたアイテム
masamallowmasamallow

前提とする環境

個人用PCにおいて、複数アカウントに対してそれぞれ用途別の作業ディレクトリを以下の通り用意する。

  • アカウント
    • 個人用GitHub
      • 所属organizationあり
    • ビジネス用GitHub
      • 所属organizationあり
    • ビジネス用GitLab
      • 社内サーバ
  • 作業ディレクトリ
    ~/dev
    ├── <個人用GitHubディレクトリ>
    │   ├── <repository1>
    │   ≈
    │   └── <repsitoryN>
    ├── <その他ユーザやorganizationのGitHubディレクトリ1>
    │   ├── <repository1>
    │   ≈
    │   └── <repositoryN>
    ≈
    ├── <その他ユーザやorganizationのGitHubディレクトリN>
    │   ├── <repository1>
    │   ≈
    │   └── <repositoryN>
    ├── <ビジネス用GitHubディレクトリ>
    │   ├── <repository1>
    │   ≈
    │   └── <repositoryN>
    └── <ビジネス用GitLabディレクトリ>
        ├── <repository1>
        ≈
        └── <repositoryN>
    
    • dev全体は個人用GitHubアカウントをデフォルトとする
    • <ビジネス用GitHubディレクトリ>はビジネス用GitHubアカウント
    • <ビジネス用GitLabディレクトリ>はビジネス用GitLabアカウント
miyamo2miyamo2

<個人用GitHubディレクトリ>etcはそれぞれユーザー、orgのIDだったりGitLabがセルフホストされてるドメインが入るイメージですか?

masamallowmasamallow

はい、そんなイメージになります。
<XXXディレクトリ>etc. はローカルリポジトリを分かりやすいようにまとめるための名前付けと考えてもらえればと思います。

e.g. (実際の値はちゃんと自身のusername, ID だったりが入っています)

~/dev
├── private-github-username
├── private-github-org-you-belong
├── company-github-username
├── company-name (<- GitLab用)
≈

みたいな感じになっています。

masamallowmasamallow

単に思いつきで好みの問題ですが、以下のようにビジネス用はまとめてもよかったかも。

~/dev
├── github-username
├── github-org-you-belong
└── company-name (<-ビジネス用)
    ├── github
    └── gitlab
masamallowmasamallow

まず global な自分好みの設定

~/.gitconfig
[core]
	ignorecase=false
	quotepath=false
	pager=less -cm
	autocrlf=false
	safecrlf=true
[user]
	name = <個人用GitHubアカウント名>
	email = <個人用GitHubの公開用Eメールのユーザ名>@users.noreply.github.com
[push]
	default = current
[fetch]
	prune = true
[init]
	defaultBranch = main
~/.ssh/config
Host *
  UseKeychain yes
  AddKeysToAgent yes
masamallowmasamallow

複数リモートサーバの対応。以下を追記。

💡一応、SSH keyは個人用、ビジネス用を使い分けている。

~/.ssh/config
Host <個人用GitHubエイリアス>
    HostName github.com
    User git
    Port 22
    IdentityFile ~/.ssh/<個人用鍵>
    TCPKeepAlive yes
    IdentitiesOnly yes
Host <ビジネス用GitHubエイリアス>
    HostName github.com
    User git
    Port 22
    IdentityFile ~/.ssh/<ビジネス用鍵>
    TCPKeepAlive yes
    IdentitiesOnly yes
Host <ビジネス用GitLabホスト名>
    User git
    IdentityFile ~/.ssh/<ビジネス用鍵>
masamallowmasamallow

ビジネス用のgitconfigファイルを用意する。
(configファイル名は適当)

~/.gitconfig-biz-github
[core]
	sshCommand = "ssh -i ~/.ssh/<ビジネス用鍵> -F /dev/null"
[user]
	name = <ビジネス用GitHubアカウント名>
	email = <ビジネス用Eメールアドレス>
~/.gitconfig-biz-gitlab
[user]
	name = <ビジネス用GitLabアカウント名>
	email = <ビジネス用Eメールアドレス>

ディレクトリ毎、接続先毎に使用するgitconfigを切り替えるため、以下を追記。
💡 設定は後勝ち

~/.gitconfig
[includeIf "gitdir:~/dev/<ビジネス用GitHubディレクトリ>/"]
	path = ~/.gitconfig-biz-github
[includeIf "gitdir:~/dev/<ビジネス用GitLabディレクトリ>/"]
	path = ~/.gitconfig-biz-gitlab
[includeIf "hasconfig:remote.*.url:git@github.com:<ビジネス用GitHubアカウント名>/**"]
	path = ~/.gitconfig-biz-github
[includeIf "hasconfig:remote.*.url:git@github.com:<ビジネス用GitHub所属organization>/**"]
	path = ~/.gitconfig-biz-github
masamallowmasamallow

ssh configでKeyの使い分け定義しているのに、gitconfigで includeIf "hasconfig ... 設定して core.sshCommand を定義しているのは、
うっかり git@<ssh configのHostのエイリアス名> ではなく git@github.com にしてgit操作したときの保険。

...だったと思うけど、忘れた・・・