【GitHub】Privateリポジトリの作成から、EC2からの既存ディレクトリpush処理まで

久々の投稿です！GitHubのプライベート使えるようにしたので、ちゃんと残そうと思いました。
今回はAPサーバになっているEC2で動いているシステムをGitHub保管するために、
同じEC2内にローカルリポジトリを作成してCommitを行い、
GitHubに新規作成したリモートリポジトリへPushするやり方になります。

前提
---
* EC2にGitをインストール済み
* GitHubのアカウントは取得済み

ssh-keygenで公開鍵、秘密鍵を作る
---

* コマンドを入力  

```apache
[ec2-user@ip-x-x-x-xx]$ ssh-keygen
```

* フルパスで秘密鍵になるファイル名を入力。  
ファイル名のみだと、コマンド入力した場所に作成される。  
今回は**github**と名前をつける。  

```apache
 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): /home/ec2-user/.ssh/github
```
* 任意のパスフレーズを入力するとキーが作成される

```apache
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): /home/ec2-user/.ssh/github
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/github.
Your public key has been saved in /home/ec2-user/.ssh/github.pub.
The key fingerprint is:
54:6f:9b:68:b7:af:70:1f:92:12:2a:b7:84:79:ea:0f ec2-user@ip-x-x-x-xx
The key's randomart image is:
+--[ RSA 2048]----+
(省略)
+-----------------+
```
  
* キーが作成されていることの確認
`ls -la /home/ec2-user/.ssh/`にて`github`ファイル(秘密鍵)と`github.pub`ファイル(公開鍵)が出来ていることを確認する。

```apache
[ec2-user@ip-x-x-x-xx]$ ls -la /home/ec2-user/.ssh/
total 24
drwx------ 2 ec2-user ec2-user 4096 Nov 13 11:05 .
drwx------ 8 ec2-user ec2-user 4096 Nov 13 11:07 ..
-rw------- 1 ec2-user ec2-user  397 Apr 30  2016 authorized_keys
-rw------- 1 ec2-user ec2-user   88 Nov 13 08:01 config
-rw------- 1 ec2-user ec2-user 1766 Nov 13 10:54 github
-rw-r--r-- 1 ec2-user ec2-user  407 Nov 13 10:54 github.pub
```

GitHubへ公開鍵の登録
---
* アカウントの**Setting**を選択
![sample2.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/045a6b78-829d-78de-598f-2a8d58bde333.jpeg)
　
*  **SSH and GPG keys**を選択し、**New SSH key**を選択
![sample3.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/3eec1b10-09c0-a250-fff3-afc8af771d9f.jpeg)
　
* 作成した公開鍵をコピーして、貼り付け**Add SSH Key**を選択

```apache 
[ec2-user@ip-x-x-x-xx]$ cat /home/ec2-user/.ssh/github.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE0K6pE3FHER5qq8u0dCE77Jm5ZiMtBfPl+pv5OTA7JgAkPcLecxJW6e69oYOVF9vX59gBrP3t6TMbtqQK78uHGFcv5ThH1XQeXdqjc1vFb5JkYDHLs3tnYnapVm3i2UFxygvP5P1qDG0n6xTi3G3c4SuZ/46Bw7phkkZkqYR9VqHtvkQM2vnZz12oHYMDpvfjoeCo7z1vcxuaF/Hh6wHnA3xaWwGDJKM7FARuh7mtrTGq+D0bipkjw8Z/p7zJBhzWCMswR9o6uJfqrV+FBmgURA4kYjdvcvAFEXUlgwUAVx0fe7yYGudxDM4y6W2QGJhvk6whiA5OHOOLfFDvo/Lz ec2-user@ip-x-x-x-xx
```
![sample4.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/9caaae15-102c-443f-85d0-1e04e586ddd9.jpeg)
 
* 登録されたことを確認する。
![sample5.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/ba5e59b9-9519-f91e-5282-11271f6c257f.jpeg)

configの作成と接続確認
---
ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは秘密鍵を見に来ません。
今回、鍵を作るときに名前を指定しているため、configファイルを作成する必要があります。

* `vi ~/.ssh/config`で以下のコードを入力し、configを作成

```apache
Host github github.com
  Hostname github.com
  Port 22
  User git
  IdentityFile ~/.ssh/github
```
* パーミッションの強化
作成したままのパーミッションでは以下のエラーが起きる

```
Bad owner or permissions on /home/ec2-user/.ssh/config
```
そのため、パーミッションを強化し、オーナーのみが編集出来るようにする。

```apache
[ec2-user@ip-x-x-x-xx]$ ls -la ~/.ssh/config
-rw-rw-r-- 1 ec2-user ec2-user 95 Nov 13 12:47 /home/ec2-user/.ssh/config
[ec2-user@ip-x-x-x-xx]$ chmod 600 ~/.ssh/config
[ec2-user@ip-x-x-x-xx]$ ll ~/.ssh/config
-rw------- 1 ec2-user ec2-user 95 Nov 13 12:47 /home/ec2-user/.ssh/config
```

* 接続確認をすると、鍵のパスフレーズを聞かれるので入力

```apache
[ec2-user@ip-x-x-x-xx]$ ssh -T git@github
Enter passphrase for key '/home/ec2-user/.ssh/github':
```
以下のメッセージが出たら接続完了

```apache
Hi <GitHubユーザ名>! You've successfully authenticated, but GitHub does not provide shell access.
```
GitHub側でもキーの色が変わります
![sample6.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/ecd993a0-7d6a-7fa9-1314-105fb986cb54.jpeg)
　

ローカルリポジトリを作成（既存ディレクトリ）
---
* 既存のディレクトリで**git init**コマンド

```
[ec2-user@ip-x-x-x-xx sample]$ pwd
/home/ec2-user/sample
[ec2-user@ip-x-x-x-xx sample]$ git init
Initialized empty Git repository in /home/ec2-user/sample/.git/
```

* **.git**ファイルが作成されていることを確認

```
[ec2-user@ip-x-x-x-xx sample]$ ls -la
total 16
drwxrwxr-x 3 ec2-user ec2-user 4096 Nov 13 13:13 .
drwx------ 8 ec2-user ec2-user 4096 Nov 13 12:47 ..
drwxrwxr-x 7 ec2-user ec2-user 4096 Nov 13 13:13 .git
-rw-rw-r-- 1 ec2-user ec2-user   11 Nov 13 11:07 sample.txt
```
　

ローカルリポジトリにコミット
---
* **git add**コマンドでファイルを追加

```
[ec2-user@ip-x-x-x-xx  sample]$ git add ./*
```

* **git status**コマンドでコミット待ちファイルの確認

```
[ec2-user@ip-x-x-x-xx  sample]$ git status
On branch master
 
Initial commit
 
Changes to be committed:
  (use "git rm --cached  < file >..." to unstage)
 
        new file:   sample.txt
```
 
* **git commit**コマンドでコミット待ちファイルをローカルリポジトリにコミット

```
[ec2-user@ip-x-x-x-xx sample]$ git commit -m "first commit"
[master (root-commit) 80d1cdc] first commit
```



Privateのリモートリポジトリ作成
---
* GitHubにリモートリポジトリを作成します。
   - Repository nameの入力
   - Privateを設定
   - Initialize this repository with a READMEに**チェックを入れない**
   - **Create repository**をクリック
![sample1.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/73703148-fb27-c3ee-61ec-5b7e49ccc2dc.jpeg)
　
* リモートリポジトリが作成される
![sample7.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/edb945bd-fb70-50d3-33ae-4f2d5095767a.jpeg)

リモートリポジトリへのPush
---
* リモートリポジトリを登録する
   - 以下のアドレスをコピーする。
![sample8.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/2d8570d8-a146-9d26-7e5f-13de8fb00e70.jpeg)
   
- **git remote add**コマンドでリモートリポジトリを追加
  
```
[ec2-user@ip-x-x-x-xx sample]$ git remote add origin git@github.com:<ユーザ名>/TestRepository.git
```
    
- **git remote -v**コマンドで追加されたリポジトリの確認

```
[ec2-user@ip-x-x-x-xx sample]$ git remote -v
origin  git@github.com:<ユーザ名>/TestRepository.git (fetch)
origin  git@github.com:<ユーザ名>/TestRepository.git (push)
```

* **.git/config**の編集
**configの作成**でHostを指定しているので、urlを変更する
   * git@github.com:<ユーザ名>  からgithub:<ユーザ名>　に変更

```
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = github:<ユーザ名>/TestRepository.git
        fetch = +refs/heads/*:refs/remotes/origin/*
```
* リモートリポジトリへのPush

```
[ec2-user@ip-x-x-x-xx sample]$ git push -u origin master
Enter passphrase for key '/home/ec2-user/.ssh/github':
Counting objects: 3, done.
Writing objects: 100% (3/3), 256 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:<ユーザ名>/TestRepository-.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```
* GitHubでPushされたことを確認
![sample9.jpg](https://qiita-image-store.s3.amazonaws.com/0/33165/696e1a65-5b8e-6dac-56da-829efddb8f7c.jpeg)

まとめ
---
一番ハマったのはデフォルトでは「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、
「~/.ssh/identity」しか秘密鍵が読み込まれないところです。
**そのことを全く知らないのに**名前付きの鍵を作ってしまいました(；・∀・)
こちらの記事に助けていただきました、ありがとうございます！
[gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](http://qiita.com/shizuma/items/2b2f873a0034839e47ce)


リモートリポジトリ作成時に**Initialize this repository with a README**に
チェックを入れたことでハマりました・・・(；・∀・)
何回やっても**! [rejected]        master -> master (non-fast forward)**がでてしまい、
何度もリポジトリ作り直ししてました＞＜

ようやく既存ディレクトリをローカルリポジトリとしたときに、
リモートリポジトリ作成時にREADME.mdファイルを作ると、その時点で競合が起きることが解りました！
リモートリポジトリからローカルリポジトリにcloneを作る場合は発生しないパターンなので、
すこし調べるのに時間がかかりましたが何とか解消できました！

コマンド部分はもうちょっと調べて、簡素化できるところはまた次回追加していきます！