Gitの複数アカウントを良い感じに管理する

2023/12/06

この記事は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のように子ディレクトリを作って管理することもできます。

まとめ

  1. ~/.gitcinfgincludeIfしてディレクトリ毎にアカウントなどの設定を切り替える。
  2. ~/.ssh/configに設定を書いておいてsshキーを使い分ける。
shin-taroのプロフィール画像

shin-taro

フロントエンドをやっています。 このブログは気ままに書いているので更新頻度は疎らです。