【これで完璧】githubにsshで接続する

githubにsshで接続したいだけなのになぜこんなに時間がかかる。
なのでもう迷わなくて済むようにまとめました。

## 私の環境
- macOS Ventura 13.2.1

## 前提
- すでにgithubアカウントを持っている
- すでにssh、gitがインストールされている(macにはデフォルトで入っているので問題ないと思うが)

## 1. ssh-keyを保管するディレクトリを作成する
何も指定しないと`~/.ssh/`直下に作成することになる。
しかし、複数のssh-keyを管理することを考慮してディレクトリをわけたい。
なので今回は `~/.ssh/github/`直下にkeyを生成する。

```
% cd ~/.ssh/
.ssh % mkdir github
.ssh % ls
github
```
できた

##### もしno such file or directoryと怒られたら
ディレクトリを作成してから再度1.を行う

```
% cd ~/.ssh/
cd: no such file or directory: /Users/you/.ssh/ ←怒られた
% mkdir ~/.ssh/
```




## 2. ssh-keyを生成する

以下の通りオプション指定しておくと`chmod`コマンド等で後からkeyの権限を変更しなくて済む。
※ `your_email@example.com`をご自身のgithubのメールアドレスにしてください。

```
% ssh-keygen -t rsa -b 4096 -C 'your_email@example.com'
Generating public/private rsa key pair.
```

次に、1.どこに、2.どんな名前で生成するか聞かれる。
何も指定しないと(そのままreturn/enterを押すと)1.`~/.ssh`直下に、2.`id_rsa`という名前で生成される。
しかし、複数のssh-keyを管理することを考慮して特定の名前をつけることにする。
なので今回は、1.`~/.ssh/github/`直下に、2.`github_id_rsa`という名前で生成する。
※ `/Users/you/.ssh/github/github_id_rsa`の`you`はご自身のマシンの名前にしてください。

```
Enter file in which to save the key (/Users/you/.ssh/id_rsa): /Users/you/.ssh/github/github_id_rsa
```

続いて、パスワードを聞かれる。
何も指定しないと(そのままreturn/enterを押すと)パスワードなしでssh-keyが生成される。
今回は念の為パスワードを指定する。

```
Enter passphrase (empty for no passphrase): # パスワードを打ってenter/returnを押す
Enter same passphrase again: # もう一度入力する
+---[XXX 0000]----+
|                 |
|                 |
|    なんか        |
|      キラキラ　　 |
|        した  　  |
|     やつ　       |
|      *.*A. .    |
|                 |
|                 |
+----[XXX000]-----+
```
できた

## 3. 本当にkeyが生成されたか確認する

```
% cd ~/.ssh/github
github % ls
github_id_rsa	github_id_rsa.pub 
```
ありそう

```
% ls -al | grep github
-rw-------  1 you  staff  1234 Feb 23 22:58 github_id_rsa
-rw-r--r--  1 you  staff   567 Feb 23 22:58 github_id_rsa.pub
```
やはりありそうなのでOK
権限はssh-keygenしたときにオプションで指定したため問題なし


## 4. ssh-agentに作成したkeyを登録する

念のためssh-agentが動いているか確認する

```
% eval "$(ssh-agent -s)"
Agent pid 63237
```
動いてるのでOK

```
% ssh-add /Users/you/.ssh/github/github_id_rsa
Enter passphrase for /Users/you/.ssh/github/github_id_rsa: # 2.で指定したパスワードを入力
Identity added: /Users/you/.ssh/github/github_id_rsa (your_email@example.com)
```
できた

## 5. `~/.ssh/config`の設定
```
% vim ~/.ssh/config
```
```~/.ssh/config
Host github.com
    HostName github.com # このまま
    IdentityFile ~/.ssh/github/github_id_rsa # keyのpathを指定する
    IdentitiesOnly yes # IndentityFileで指定したpathのkeyのみを参照するため
    TCPKeepAlive yes # 接続中に操作せずに数分放置してもsshが切断されないようにするため
    AddKeysToAgent yes # 接続時に毎回パスワードを求められないようにするため
    UseKeychain yes # 接続時に毎回パスワードを求められないようにするため
    User git # このまま
```

## 6. github側での設定

### 6.1 githubにいく前に生成したkeyをclipboardにコピーしておく

```
% pbcopy < ~/.ssh/github/github_id_rsa.pub
```

### 6.2 githubにログインして新規sshを追加する
githubのご自身のアイコンをタップし、「Settings」をクリックする
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321897/84512545-11ec-1c44-5b21-223c8aa28e13.png">

サイドバーから「SSH and GPG keys」を、その後「New SSH key」をクリックする
![Screenshot 2023-05-28 at 15.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321897/80f2371b-5ba0-1509-cc53-d44fcdcfcc5a.png)

Titleを入力したら、6.1でコピーしたkeyをペーストし、「Add SSH key」をクリックする
![Screenshot 2023-05-28 at 16.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321897/301185ca-9024-f6aa-5622-d02084b858c5.png)


## 7. 接続を確認する

```
% ssh -T git@github.com
Hi your_github_name! You've successfully authenticated, but GitHub does not provide shell access.
```
できた

##### もしThe authenticity of host 'github.com (xx.xx.xxx.xx)' can't be established.と怒られたら
初めてgithubに繋ぐ場合に出る警告なので、yesを入力する。

```
% ssh -T git@github.com
The authenticity of host 'github.com (xx.xx.xxx.xx)' can't be established.
AA11111 key fingerprint is SHA256:hogehogehogehoge...
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes ←yesを入力
```

## 8. git configも設定する

### 8.0 前提知識
gitの設定ファイルは3種類ある

|種類|影響範囲|ファイルのpath|備考|
|:-----:|:-----:|:-----:|:-----:|
|system|システム全体、全ユーザの全リポジトリ| `/etc/gitconfig` |-|
|global|当該ユーザの全リポジトリ| `~/.gitconfig` |HOME直下|
|local|特定のリポジトリのみ| `特定のリポジトリのpath/.git/config` |指定したリポジトリ直下の `.git`|

今回はglobalで設定を行う

### 8.1 `~/.gitconfig`の設定

```
% git config --global user.name 'your_github_user_name'
% git config --global user.email your_email@example.com
```

### 8.2 確認する

```
% vim ~/.gitconfig
```
```
[user]
        name = your_github_user_name
        email = your_email@example.com
```
できてる
これでも確認できる

```
% git config --list
user.name=your_github_user_name
user.email=your_email@example.com
```
できてる

## 参考
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
[お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
[GitHubにSSH認証で接続する](https://qiita.com/NoName/items/9c1928f5a98233173580)
[【Github, SSH】SSH鍵を作成し、Githubへそれを登録する手順](https://qiita.com/knife0125/items/50b80ad45d21ddec61a9)
[gitのssh接続に使用する~/.ssh/configの設定について](https://qiita.com/kawahara_hiroyuki/items/3ad35c548d1007c12109)
[Gitの設定をgit configで確認・変更](https://note.nkmk.me/git-config-setting/)
[gitとsshのconfigについて(備忘録)](https://qiita.com/yoshidev523/items/b5e5923b2f658f09e0a6)