Windows+SourceTree+GithubではSSHログインを有効にしておこう

# 概要
Windows+SourceTree+Githubの認証は様々ありますが、一番安定するのはこのパターンだと思います。

- Windows10
- SourceTree v3.3.9

# SourceTreeのGithub認証設定の確認
Githubで普通にログイン出来る環境でSourceTreeでツール→オプション→認証
が以下のように

- 認証：OAuth
- プロトコル：SSH

になっていれば何も気にしなくて良いです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/0dfe85ef-369a-a4aa-a00e-c79223760d0c.png)

そうでない場合は以下の設定をします

## Putty Key GeneratorでSSHの公開鍵と秘密鍵のペアを生成
SourceTree上でツール→SSHキーの作成/インポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/c87dc104-b588-6294-2ad1-6e0941d96c0a.png)

Putty Key Generatorが立ち上がるので　Generateを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/2613c4f6-21e0-295d-2b75-369ef3dbbcf0.png)

このあたりをマウスでグリグリ動かして乱数を生成していく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/523b5218-6cd2-8f1f-b1e9-90397db20312.png)


生成されたらKey PassphraseとConfirm Passphraseに自分で決めたパスワードを入力しておいて
「Save Public Key」と「Save Private Key」でそれぞれ公開鍵と秘密鍵のペア鍵ファイルを適当なディレクトリに保存する
![save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/ccae88a9-5dd2-e0d8-344c-52ee855ee40f.png)

### OpenSSH公開鍵の保存
そして**赤で囲った部分も別のtxtファイルとして適当なディレクトリに保存する**（OpenSSHの公開鍵としてGithub上で使います）
![OpenSSH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/289d1a3a-1441-ca54-10bb-36bef150705b.png)

つまり **Putty Key Generator 経由で3個のファイルを生成してします。**

- Putty秘密鍵 (id_rsa_Github_YourName.ppk みたいな\*.ppk )
- Putty公開鍵 (id_rsa_Github_YourName.pub みたいな\*.pub)
- OpenSSH公開鍵 (id_rsa_Github_YourName_OpenSSH.txt みたいな普通のテキストファイルでOK)

## Github上で公開鍵を登録
`https://github.com/settings/keys`
https://github.com/settings/keys

にブラウザでアクセスして「New SSH Key」をして、適当なタイトルをつけて、KeyのところにOpenSSH公開鍵の保存 で保存したテキストの内容をコピーして「Add SSH Key」で登録します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/26295fcc-0502-6cc3-5ada-fbcad9d31dd9.png)

（これでGithub側に、さっきPutty Key Generatorで生成したあなたの公開鍵、秘密鍵のペアに相当する認証が通るようになります）
（GithubはPuttyで生成した公開鍵 .pub を認識できないため、OpenSSH用の公開鍵形式を使います）

## 最後にSourceTreeの認証をSSH経由にして、生成した鍵を使う
再度SourceTree上でツール→SSHキーの作成/インポート
を選んでPutty Key Generatorが起動したらLoadをして ppk (先ほど生成した秘密鍵の方)を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/b427e37c-e577-98ca-b5bb-99cb1264dbc9.png)

## SourceTree上の認証をSSH+OAuth経由に設定して認証できることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/35641bf7-9272-dfb2-8726-acd729bc990e.png)

これで当初の目的が達成できました。

生成したputtyの秘密鍵、puttyの公開鍵、OpenSSHの公開鍵は紛失しないようにしましょう（正確には、紛失したときはGithub上ですぐにKeyをRevokeするようにしましょう）

# Q&A
## なぜHTTPS+Token認証はダメなのか
プライベートリポジトリ+Git Submoduleのリポジトリ構造になったときに、HTTPSだとSubmodule再帰のチェックアウトに失敗するため

## なぜBasic認証はダメなのか
リポジトリの設定でBasic認証が不可になっている場合、チェックアウトなどに失敗するため（そして仕事のプライベートリポジトリは往々にしてセキュリティ的に不可になっています）

## Githubリポジトリからのチェックアウト
Github上でCode→Clone→SSH(git@github~~~からはじまる )を選んでコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/18b74e47-2d9b-b778-840d-1542f8291efc.png)


SourceTreeでクローンするときのリモートリポジトリurlに貼り付け

**サブモジュールに再帰のチェックを入れておく** と安心です（そうじゃないとSubmodule周りでハマるので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/48a5ca34-f72a-a6cf-3c6b-ed253e7736b6.png)