複数のgithubアカウントに1台のmacからpushできるように設定した手順

# 前提
自分のところでは仕事用のアカウントがすでに設定されているmacで
そこに勉強用を足すという状況でした。
なおこの設定は秘密鍵をgithubアカウント毎に設定しております。

事故が起きないよう~/.sshディレクトリのバックアップや
接続先の確認コマンドをこまめに実施することをオススメいたします。

```確認コマンド.sh

#コマンドは各リポジトリにて実施

# gitとの接続コマンド元から設定されているもの
$ ssh -T github

# gitとの接続コマンドプライベート用
$ ssh -T github-private


# 現在のリポジトリのリモート接続先を確認
$ git remote -v

```

# 既存のリポジトリ設定
まずは既存のリポジトリ設定を整理していきます。
既存のリポジトリはホストがgithub.comで設定されている状況でした。

```now.sh

$ ssh -T git@github.com
Hi username! Youve successfully authenticated, but GitHub does not provide shell access.

```

今回追加したいのもgithubの、もう１つのアカウントです。
つまり１つのPCからgithubの２つのアカウントにpushできるようにしたいのです。

そこでまずはmacの~/.ssh/configにhostの設定をします。
以下追記します。追記場所はどこでも大丈夫だと思います。

```config

Host github-work
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_work_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes

```

これはホスト名と秘密鍵を指定する作業となり
github-workというホスト名でssh接続をしようとした際は
id_work_rsaという秘密鍵を使ってくださいねとなります。

configファイルを保存したら以下のコマンドで
githubと通信ができるか確認してみましょう。

```connect.sh

$ ssh -T github-work
Hi username! Youve successfully authenticated, but GitHub does not provide shell access.

```

↑このようにこれまでと同じusernameでメッセージが返ってきたらこれまでと同じアカウントに指定の秘密鍵で通信ができているということになります。

エラーが出た場合はgithubの設定を確認して
macの秘密鍵とgithub上に設定されている公開鍵が
きちんと設定できているかを確認してみてください。
https://github.com/settings/ssh

[>>参考:GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce#%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92github%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B)

# リモートリポジトリを設定（既存ローカルリポジトリ毎に）
macの中で管理しているリポジトリ（githubに紐づいているもの）に移動して
以下のコマンドでリモートリポジトリを設定します。

```setorigin.sh

#mac内の既存リポジトリに移動
$ cd projectA

#現状のリモートリポジトリを確認。
$ git remote -v
origin git@github.com:username/ripositoryname.git

#host名はconfigのHost＝github-private
#ユーザーID、リポジトリはgithubのものを設定
#git remote set-url origin [Host名]:[ユーザ名]/[リポジトリ名].git
$ git remote set-url origin github-work:username/ripositoryname.git

```

このリモートリポジトリはローカルに複数のリポジトリがあれば
ローカルリポジトリごとに設定する必要があります。
この作業で明示的にホスト名：秘密鍵のペアを作成して
このホスト名だったらこの秘密鍵を使って
リモートにアクセスするという設定ができました。

この設定をする前まではドメインに基づいて秘密鍵を選び
ssh接続していたということになります。


# 新しいgithubアカウントへの接続設定

## １.公開鍵、秘密鍵を別名生成
上書きを防ぐため鍵の入っていないディレクトリに移動して以下のコマンドを実行。


対話形式で進めますが以下のように最初に聞かれるところで
名前をid_private_rsaとします。

```id_private_rsa

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_private_rsa

```

名前を聞かれた後にssh接続のパスワード設定をするか聞かれますが
今回は勉強用ということもあり何も入力せずにreturnキーを押します。
その後パスワードの確認も未入力でreturn。

## 2.githubにプライベート用アカウントを作成し
公開鍵をアップロードします。
[>>参考:GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce#%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92github%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B)

## 3.ローカルPCの~/.ssh/configファイルを設定

プライベート用のHostを設定します。
以下を追記します。
追記場所はおそらくどこでも良いと思います。

```config

Host github-private
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_private_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes

```

## 4.リポジトリごとのリモートを設定します。

ローカルで新しく作った勉強用リポジトリに移動して以下を実行します。
これによりローカルのリポジトリとgithub上のリモートリポジトリが結びつきます。

```addremote.sh

#まずはリモートリポジトリを追加します。githubでアカウント作成した時に表示されるやつです。
#これやらずにいきなりsetーurlするとエラーが出ます。fatal: No such remote 'origin
$ git remote add origin https://github.com/githubアカウント/リポジトリ名.git

#host名はconfigのHost＝github-private
#ユーザーID、リポジトリはgithubのものを設定
$ git remote set-url origin [Host名]:[ユーザID]/[リポジトリ].git

```

リモートが設定できたかを確認します。

```verify-remote.sh

$ git remote -v

```

## 5.githubとの接続を確認します。
以下を実行します。

```connect.sh

#ここで新しいアカウント名が表示されていたらこのPCから新しいgithubアカウントに接続できているということになります。
$ ssh -T github-private

```

## 6.テストpush
勉強用リポジトリからテストを行います。
pushして新しいgithubアカウントのリポジトリに反映されれば完了です。

```test.sh

$ touch test.txt
$ git add  .
$ git commit -m "Test commit"

```

# 参考URL
大変お世話になりました。感謝です。
[>>参考：GitHubを複数のアカウントで利用するためのメモ](https://qiita.com/BlueEventHorizon/items/f9d81e3659ebce9e1ffc)
[>>参考:GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce#%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92github%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B)