Gitの複数アカウントを良い感じに管理する
この記事はQiitaから移行してきました。
概要
仕事用と個人開発用とか、仕事で社内とクライアント用を分けてるとか、色々な理由でgitのアカウントやsshキーやらの設定を使い分けたいことがあると思います。
僕は個人用仕事用合わせて4つを使い分けないといけないので、いい感じに管理できるように設定しています。
ディレクトリ毎に使用する.gitconfigを切り替える
gitのアカウントですが、remoteのGitHub等のアカウントと連動して.gitconfigに設定されているuser.nameやらuser.emailを変えたいですよね。
localの.git/configに設定することもできますが、複数リポジトリある場合に毎度設定するのも面倒です。
そこで、globalの設定をディレクトリ毎に自動で切り替えることで解決します。
global設定の~/.gitconfigの中でincludeIfを使う事で条件付きで別のconfigファイルを読み込むことができるので、それで実現します。
まず各アカウント用のconfigファイルを作成します。
場所はどこでも良いですが、僕はhomeディレクトリ直下にgitconfigsというディレクトリを作ってそこに全部入れています。
[user]
name = Shin-Taro_github
email = Shin-Taro_github@gmail.com
[user]
name = Shin-Taro_gitlab
email = Shin-Taro_gitlab@gmail.com
そしてincluedIfを使ってこいつらを~/.gitconfigから参照します。
ディレクトリの条件はgitdirで指定します。
[user]
name = Shin-Taro
email = Shin-Taro@gmail.com
[includeIf "gitdir:~/projects/github/"]
path = ~/gitconfigs/.gitconfig_github
[includeIf "gitdir:~/projects/gitlab/"]
path = ~/gitconfigs/.gitconfig_gitlab
これで~/projects/github/配下のリポジトリでは~/gitconfigs/.gitconfig_githubを
~/projects/gitlab/配下では~/gitconfigs/.gitconfig_gitlabを
それ以外の場所では元々の~/.gitconfigを自動的に適用してくれます。
快適!!!
複数のsshキーの設定
さて、アカウント管理は良い感じになりましたがremoteに接続する際のsshキーも良い感じに管理したいです。
全部同じキーを使う事も出来ますが、当然セキュリティ上よくないですし、メールアドレスで紐づけていたりもするので使い分けたいですね。
ssh接続する際の基本形
まずssh接続の基本的なコマンドは以下のようになると思います。
オプションでポートや公開認証を指定したりできますが、今回は割愛します。(というかあんまり知りません)
# 一番シンプル
ssh ホスト名
# ユーザー名を指定する場合はこう
ssh ユーザー名@ホスト名
で、GitHubからsshでcloneするときとかはこんな感じになります。
git clone git@github.com:ユーザー名/リポジトリ名.git
ユーザーはgitでホストはgithub.comですね。
この時デフォルトでは~/.ssh/にある鍵を見に行くようです。
複数キーの設定
さて、マシン上にある秘密鍵とホスト名やユーザー名を紐づけるような形で設定しておけばこんな感じに書けます。
git clone 任意の名前:ユーザー名/リポジトリ名.git
設定は~/.ssh/configに書きます。
Host github
Hostname github.com
User git
IdentityFile ~/.ssh/github
Host gitlab
Hostname gitlab.com
User git
IdentityFile ~/.ssh/gitlab
色々設定できますが、とりあえず4つ書いておけばOKです。
Host(接続する際に使う任意の名前)Hostname(接続先のホスト名)User(接続するユーザー名)IdentityFile(使う鍵のファイルパス)
Hostnameはドメイン名またはIPアドレスです。
HostNameは何も指定しない場合Hostと同じ値が設定されます。
なので、接続する際の名前とホスト名が同じで良いなら以下のように書けます。
Host github.com
User git
IdentityFile ~/.ssh/github
Userは任意の名前にもできますが、サービスによっては決まっていることもあります。
例えばGitHubはgitじゃないとだめですし、Bitbucketはアカウントのユーザ名になります。
IdentityFileで鍵の場所を指定するので~/.ssh/github/workと~/.ssh/github/privateのように子ディレクトリを作って管理することもできます。
まとめ
~/.gitcinfgでincludeIfしてディレクトリ毎にアカウントなどの設定を切り替える。~/.ssh/configに設定を書いておいてsshキーを使い分ける。
