Open9
[Git] 個人用PCで複数のリモートサーバやアカウントの違いを吸収するためのいつものconfigメモ
ピン留めされたアイテム
前提とする環境
個人用PCにおいて、複数アカウントに対してそれぞれ用途別の作業ディレクトリを以下の通り用意する。
- アカウント
- 個人用GitHub
- 所属organizationあり
- ビジネス用GitHub
- 所属organizationあり
- ビジネス用GitLab
- 社内サーバ
- 個人用GitHub
- 作業ディレクトリ
~/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アカウント
<個人用GitHubディレクトリ>
etcはそれぞれユーザー、orgのIDだったりGitLabがセルフホストされてるドメインが入るイメージですか?
はい、そんなイメージになります。
<XXXディレクトリ>
etc. はローカルリポジトリを分かりやすいようにまとめるための名前付けと考えてもらえればと思います。
e.g. (実際の値はちゃんと自身のusername, ID だったりが入っています)
~/dev
├── private-github-username
├── private-github-org-you-belong
├── company-github-username
├── company-name (<- GitLab用)
≈
みたいな感じになっています。
単に思いつきで好みの問題ですが、以下のようにビジネス用はまとめてもよかったかも。
~/dev
├── github-username
├── github-org-you-belong
└── company-name (<-ビジネス用)
├── github
└── gitlab
まず 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
複数リモートサーバの対応。以下を追記。
💡一応、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/<ビジネス用鍵>
ビジネス用の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
参考
See: Conditional includes
ssh configでKeyの使い分け定義しているのに、gitconfigで includeIf "hasconfig ...
設定して core.sshCommand
を定義しているのは、
うっかり git@<ssh configのHostのエイリアス名>
ではなく git@github.com
にしてgit操作したときの保険。
...だったと思うけど、忘れた・・・