Cloud9からGitHubのレポジトリへSSHでpushする手順（エラー解決方法含む）

- **Git BashなどでGitを動かしたことがある。**
- **GitHubのレポジトリは作成済。**

という方で、

- **「初めてAWS Cloud9上で開発を始めたため、作成したソースを、既にあるGitHubのレポジトリへアップしたい」**

という方向けに作成しました。

私自身はgit bashでGit/GitHubを操作したことはありましたが、初めてCloud9でgitを扱う際、色々とエラーが出て困ったので、Cloud9用の記事が欲しかったなと思って作成しました。

なお、GitHubのレポジトリは「公開」にしている前提です。
（非公開だとまた手順が異なるよう）

※Git/GitHub初学者の方は以下の動画がおすすめです。
https://www.udemy.com/share/101vBkAEMYcFxTTHgE/

# はじめに
まずはcloud9のターミナルを用意。
念のため、gitが入っているか確認します。（Cloud9だと当然入っていますが）

```
$ git --version
git version 2.14.5
```

# ローカルレポジトリ作成
ローカルレポジトリを作成したい任意のディレクトリに移動し

```
$ git init
```

を実行すると、「.git」ディレクトリ（ローカルレポジトリ）が生成されます。

# ステージングエリアにadd
まずは、ステージングエリアにadd

```
$ git add [file]
```

※git addのオプションについては以下がわかりやすかったので参照下さい。
https://note.nkmk.me/git-add-u-a-period/

# ローカルレポジトリにcommit
そして、ステージングエリアにあるファイルをローカルレポジトリにcommit

```
$ git commit -m "[任意のメッセージ]"
```

# リモートレポジトリの登録とgit push
commitできたら、cloud9上で作成したgitのローカルレポジトリには登録完了です。
次に、GitHubのレポジトリ（リモートレポジトリ）にpush（アップロード）する必要があります。
まずはリモートレポジトリの登録から

```
$ git remote add origin git@github.com:[自身のGitHubのレポジトリ].git
```

その後、

```
$ git push -u origin master
```

ここで下記のようなエラーが出る方がいると思います。

```
Permission denied (publickey). 
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists. 
```

上記のエラーは、それぞれの行ごとに、以下のような意味です。 

```
パブリックキーで権限が拒否された。
リモートリポジトリが読み取れない。
アクセス権持っている？それともリポジトリ自体存在している？
```

エラーを解決していきましょう。

先ほど、リモートレポジトリの登録は完了したかと思います。
そのため、先ほどのエラーメッセージの「リモートレポジトリ自体存在している？」は問題ないということになり、
*「アクセス権持っている？」が問題になります。*

では、アクセス権を得ましょう。

**GitHubへアクセスには、公開鍵が必要です。**
開発環境で公開鍵を作成し、GitHubへ公開鍵を登録することでアクセスできるようになります。

# 公開鍵の作成
まずは、cloud9内のディレクトリに、公開鍵を作成します。

```
$ ssh-keygen -t rsa -C "[リモートレポジトリを登録した自分のメールアドレス(・・・@gmail.comなど)]"
```

（-Cより後のコメント部分はなくても実行可能ですが、GitHubに登録しているEmailアドレスを指定するのが一般的のようです）

「ssh-keygen」はSSH（Secure SHell）の公開鍵と秘密鍵を作成するコマンドです。
ちなみにオプションの意味は

- 「-t rsa」・・・作成する鍵の暗号化形式を「rsa」で指定
- 「-C "コメント"」・・・コメントを指定

もっと詳しく知りたい方は以下記事がよいと思います。
https://www.atmarkit.co.jp/ait/articles/1908/02/news015.html

実行すると、以下のメッセージが出てきます。Enter～から始まる行が3回あり、各行にて入力を求められますが、すべて何も入力せずEnterを押して問題ありません。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
```

上記でEnterを３回押すと、以下のメッセージが表示され、公開鍵が作成されます。（randomart imageの箇所は適当に書き換えています）

```
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:・・・・・・・・・・・・・・・・・・・・・・・・・・ 　……………@gmail.com
The key's randomart image is:
+---[RSA 2048]----+
|....................       |
| ..........        |
|   ......= ......       |
|    *..... .....        |
|   ...... BS+       |
|    =...........o..      |
ho
host github
|   .................       |
|    ......o*=.....＋       |
|    .E..........*......      |
+----[SHA256]-----+
```

その後、.sshディレクトリを確認すると、公開鍵が作成されているのがわかります。

```
$ ls ~/.ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts
```

#id_rsa.pubファイルの内容をコピー
下記コマンドでid_rsa.pubのファイル内容を表示し、中身をコピーします。
（lessコマンドで中身を見るのではなく、ファイルの中身をすべてコピーしてもＯＫ）

```
$ less ~/.ssh/id_rsa.pub
```

ファイル内の以下のssh-rsaから始まる部分をコピーします。（メールアドレスまでコピーに含めても含めなくても特に変わりないのでどちらでも構いません）

```
ssh-rsa ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・ [メールアドレス]
```

# 公開鍵をGitHubに登録
今コピーした部分を、GitHubに登録するのですが、まずGitHubにブラウザからアクセスし、右上の自分のプロフィール画像から「settings」をクリック


<img width="234" alt="image2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590791/9b7eeb82-c317-4873-4b0c-77cff31dc1b2.png">
















そして、左側のメニューから「SSH and GPG keys」を選択し、「New SSH key」をクリックします。

<img width="799" alt="image3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590791/06bdb052-9ee8-4f97-281f-3f62140a9261.png">












すると、登録画面が出てきます。
登録画面の「key」部分のテキストエリアに先ほどコピーした「ssh-rsa」から始まる文言を貼り付けます。
ちなみに、タイトルは何でも構いません。

<img width="763" alt="image4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590791/89e398d6-d87e-9658-0f6a-2b34f057e93d.png">















貼り付けができたら「Add SSH key」をクリック。

ここで、下記コマンドを打てば接続に成功できると書いている記事が多いですが、エラーが出て接続に失敗する場合もあります。

```
$ ssh -T git@github.com
```

# configファイルの作成
接続に失敗する場合は、.sshのディレクトリ内に「config」というファイルを作成します。
vimで、ファイルの作成と中身の記述を行います。

```
$ vim ~/.ssh/config
```

configファイルの中身に、下記の文言を貼り付けます。
なお、**IdentityFile**の後のパスは、自身の「id_rsa」ファイルを格納しているパスに変えてください。

```
Host github github.com
  HostName github.com  IdentityFile ~/.ssh/id_rsa
  User git
```

# 新規作成ファイルの権限設定
作成できたら、権限設定をします。
新規でファイルを作成したので、適切な権限を設定し、適切に実行できるようにします。

作成した当初は、configファイルに何も権限がない状態。

しかし今回は、「**所有者**に**読み取り権限**があり、**その他のユーザ**には**権限がない**」という状態にする必要があります。

そのため、権限は600か400にします。
（書き込み権限はあってもなくてもよいため）

所有者以外には権限を与えてはいけません。
600にするならば、以下を実行します。

```
$ chmod 600 ~/.ssh/config
```

# ssh実行
そして、下記を実行。

```
$ ssh -T git@github.com
```

実行し、下記のような文字列が出力されたらOK！

```
Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.
```

**これで、git pushが可能になります。**

# 最後に、git pushを行う
git pushで、ローカルレポジトリのファイル類をリモートレポジトリにアップロードできます。

```
$ git push origin master
```

これで完了です！