0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gitで複数のアカウントを切り替える方法

Last updated at Posted at 2024-07-11

初めに

本記事はgithub等をSSH接続で利用する場合を考えて話を進めます。

多くのサーバークライアントプログラムではユーザー名とパスワードをサーバーに送信して認証を行い、セッションを確立します。セッション確立の際にセッションIDが発行され、それを保存することでログイン状態を保持します。
しかし、gitのSSHを用いた接続ではそれらの代わりに秘密鍵公開鍵を使用します。公開鍵認証では、ユーザーは事前に生成した公開鍵をリモートリポジトリのアカウントに登録します。ユーザーがGitコマンドを実行すると、Gitは秘密鍵を使ってリモートリポジトリに接続します。サーバーはクライアントから送られてきた秘密鍵から公開鍵(とそれを紐づけたアカウント)を特定し、接続を許可します。
(僕の認識に間違いがあったようです。この辺は飛ばしてください)

つまり、Gitで複数アカウントを切り替えるには、いかにSSH鍵を切り替えるかが問題となるわけです。

環境

Windows11
git version 2.42.0.windows.2

手順

順に説明する。

1 公開鍵、秘密鍵の生成

$ cd ~/.ssh

まずhomeディレクトリ内の.sshに移動する。

$ ssh-keygen -f id_rsa_(任意の名前)

次にssh-keygenコマンドで鍵を生成。
-f オプションは生成するファイル名を指定する。
利用するアカウントの数だけここで鍵を生成しておく。

ssh-keygenを実行すると入力を求められますがEnter連打でも大丈夫です。

2 公開鍵の登録

ssh-keygenコマンドの実行によって~/.ssh内にid_rsa_(任意の名前)id_rsa_(任意の名前).pubの二つのファイルが生成される。前者が秘密鍵で、後者が公開鍵である。id_rsa_(任意の名前).pubの方をメモ帳などで開くと中身が

ssh-rsa (英数字の羅列) (端末名など)

になっている。ssh-rsa (英数字の羅列)の部分をコピー。
github等にアクセスし、公開鍵としてコピーした文字列を登録する。

全てのアカウントについてこの作業を行う。

3 Configの設定

$ cd ~/.ssh
$ type nul > config

~/.ssh内にssh用のconfigファイルを作成する。
ファイルには次のように記述する。

config
Host github-(任意の名前1)
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_(任意の名前1)
  User git
  IdentitiesOnly yes

Host github-(任意の名前2)
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_(任意の名前2)
  User git
  IdentitiesOnly yes
  
...(生成した鍵の数だけ同様に記述する)
  • HOST: 今回はgithub-(任意の名前)にしているが、自分がわかりやすい名前なら何でも大丈夫
  • IdentityFile : 生成した秘密鍵のパス

ここまでの手順がうまくいっていた場合は、sshを次のように叩くと接続確認が行える。

$ ssh -T github-(任意の名前1)
Hi (アカウント名1)! You've successfully authenticated, but GitHub does not provide shell access.

本来はgit clone等をする際にurlとしてgit@github.com:(ユーザー名)/(リポジトリ名).gitと入力する。しかしConfigでHOST名とSSHキーを紐づけているため、使いたいアカウントに応じてgithub-(任意の名前1):(ユーザー名)/(リポジトリ名).gitの形式に書き換える必要がある。

4 gitの設定

鍵の準備が終わったので、gitでどうやって鍵を使い分けるかを設定する。
使い分け方法として次の2通りを想定した。

  1. global設定を利用する
    global設定でメインアカウントを設定し、サブアカウントを使いたいファイルだけ個別にlocal設定でアカウント情報を設定する方法。
    メインアカウントの設定は1度で済むがlocalの設定をうっかり忘れてしまうと、サブアカウントを使うつもりがメインアカウントを使っていた、なんてことが起きかねない。
  2. global設定を利用しない
    global設定はせずにlocalの設定だけでgitを使う方法である。1つ目の時のようなミスは起こらないがローカルリポジトリを登録する際に毎回local設定をする必要がある。

使い分けイメージ図

好きなほうをご利用ください。

方法1

$ git config --global user.name "名前1"
$ git config --global user.email "メルアド1"
$ git config --global url."github-(任意の名前1)".insteadOf "git@github.com"

まずglobal設定を行う。

$ git config --local user.name "名前n"
$ git config --local user.email "メルアドn"
$ git config --local url."github-(任意の名前n)".insteadOf "git@github.com"

次にlocal設定をする。
初めてのcommitの前に上のようにコマンドを叩く。

local設定を忘れてしまうとglobal設定を使ってしまうので注意。

$ git config --global url."github-(任意の名前1)".insteadOf "git@github.com"

をしているため、今後メインアカウントでgit clone等をする際はurlとしてgit@github.com:(ユーザー名1)/(リポジトリ名).gitと入力だけで自動的にgithub-(任意の名前1):(ユーザー名)/(リポジトリ名).gitの形式に変換してくれるようになる。
しかしサブアカウントでgit clone等をしたい際は手動でgithub-(任意の名前1):(ユーザー名)/(リポジトリ名).gitの形式に書き換えないといけない。これを忘れるとメインアカウントで処理してしまう。

方法2

$ git config --local user.name "名前n"
$ git config --local user.email "メルアドn"
$ git config --local url."github-(任意の名前n)".insteadOf "git@github.com"

global設定は何もせずに
初めてのcommitの前に1度だけ上のようにコマンドを叩く。

もしglobal設定にuser.nameやuser.emailが設定されているのであれば別途削除してください。

まとめ

これらの手順を進めることでSSHキーを適切に切り替えて処理してくれるようになります。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?