SSHでcloneしたら突然push/pullできなくなった件

Android Studio で開発していたアプリを GitHub で管理していましたが、しばらく他の執筆で放置していたらいつの間にか push/pull できなくなっていたので、発生した事象とその対策について記載します。

# 時間がない人のためのポイント
* SSH で clone したリポジトリを push/pull しようとしたら、リモートリポジトリが見つからなくて詰む
* SSH executable を Native にしたところ解決
* 基本 SSH じゃなくて HTTPS にしたほうが吉

# 環境
* OS : Windows10 Pro
* IDE : Android Studio 3.2.1
* Git : MSYS2版Git（PATH通し済）
* C:/Users/[user]/.ssh を作成済、公開鍵・秘密鍵も作成済
* リモートリポジトリをSSH公開鍵認証方式でclone

# 発生した事象
* 久しぶり（1,2ヶ月くらい）にIDE上で push/pull をしたところ、下のダイアログが表示され、Yesを押しても最終的にUpdate cancelと表示されて失敗する
* ~/.ssh/known_hosts をCUIで再生成しても変わらない
* 公開鍵・秘密鍵を再生成しても変わらない
* CUIで`ssh git@github.com`は問題なく通る
* ローカルリポジトリのコミットは問題なくできる

![DrDmGxyU4AAZUTc.jpg](https://qiita-image-store.s3.amazonaws.com/0/209042/77c3ecd3-ba21-063f-3ba8-bcc3ca8a5a35.jpeg)

モザイク掛けてますが、GitHubのフィンガープリントなので別に隠す必要はなかったりします。

# とにかく接続するために取った対策
個人ではにっちもさっちも行かなかったので、Twitterやリアルでつぶやいたところアドバイスをいただきました。これらを基に取り急ぎ対策を行いました。

### URL, 引数の入力に誤りが無いか
→ [プロジェクト名]/.git/config を確認し、url = xxx.gitに誤りがないことを確認。

```text:config
[remote "origin"]
	url = git@github.com:Hide-KC/xxx.git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

### FTP/HTTP でプロトコルが合っているか
→ SSH公開鍵認証方式なのでたぶん大丈夫。公開鍵もGitHubに登録してあることを確認。

### 文字コードが接続元と先で合致しているか
→ 文字コードは設定するような箇所が見つけられなかったのでたぶん大丈夫。

### git.exe をフルパス指定したらどうか
→ 指定しても結果は変わらず。

![AndroidStudio_Git設定_編集.png](https://qiita-image-store.s3.amazonaws.com/0/209042/391379c8-cac6-46c5-5919-cf2ec2647cb7.png)

### SSH executable を Native にしてはどうか
（前節の黄色い枠のちょっと下の部分を、Built-inからNativeに変えてみた）
→ **pullできたあああああああああ！！！！！！**

というわけで、癌はこの**SSH executableのBuilt-in設定**でした。

# SSH executable って何？
[IntelliJ IDEAヘルプ](https://pleiades.io/help/idea/using-git-integration.html#password-policy)では次のように説明されていました。
まずはBuilt-in。

> ビルトイン：すべての権限はIDE側で実行されます。
> 認証にログインとパスワードを使用する場合は、選択されたパスワードポリシーに従って認証が行われます。

> パスフレーズのないSSHキーを認証に使用すると、IntelliJ IDEAは ~/.ssh/config ファイルにアクセスし、そこからキーを取得します。

> 認証にパスフレーズ付きのSSH鍵が必要な場合、Gitは信任状ヘルパーでそれを探し、信任状ヘルパーが見つからなければ、IDEにプロンプ​​トを返します。 パスワードポリシーを設定した場合、IntelliJ IDEAはパスワードデータベース内の資格情報を探します。パスワードデータベースがない場合、プロンプトが表示され、SSHキーとパスフレーズを入力する必要があります。

そしてNative。

> ネイティブ：すべての権限はGit側で実行されます。
>プロンプトは表示されませんので、パスフレーズなしでSSHを使用している場合、またはパスフレーズが認証情報ヘルパーに保存されている場合、またはSSHエージェントがある場合はこの認可タイプを選択してください。

ビルトインで問題になりそうなのは、~/.ssh/config の参照あたりでしょうか。
しかし、今回のケースではconfigファイルは作ってありましたし（正確には`C:\Program Files (x86)\Git\etc\ssh\config`へのハードリンクを作成していた）、`ssh -vT git@github.com`でもconfigを読めていたのでちゃんと参照できていたようです。

ダイアログを改めて見ると、「Do you want to add this host to known hosts database ?」と聞かれていたので、どうも known hosts データベースに登録ができなくて詰んでいる様子でした。

じゃあ known hosts データベースってどこにあるの～と思って調べていましたが、次のStackOverFlowのコメントが参考(?)になりました。

> I had same issue with IDEA 13 and 14. By default, IDEA will try to create/access .ssh/known_hosts file in %HOME% directory.

> However, %HOME% was not defined on my system (Windows 7 Enterprise x64). IDEA wouldn't store key; rather, it would ask for it for every operation.

> When I defined %HOME% (%HOME% = %HOMEDRIVE% in my case), everything worked as advertised.

> This is a confirmed bug in IDEA; it should search:
...
[How to store SSH host key in IntelliJ IDEA](https://stackoverflow.com/questions/6746746/how-to-store-ssh-host-key-in-intellij-idea)

`HOME/.ssh`を参照しにいくけど、WindowsではHOMEディレクトリが定義されていないから（HOMEはUNIX系OSだから当然）、known_hostsが見つからなくて詰むということみたいです[^1]。
確認されたバグ、と書かれていたのでここで原因調査は打ち切り。これ以上はちょっとごめんなさい。

一方、 Native にするとなぜ動くか。
公式ヘルプにもある通り、**すべての権限がGit側で実行される**ため、Git側でキーを探しにいったと考えられます。私の知識ではこれしか言えない。
Git/SSH完全に理解した人に降臨してほしい。

# HTTPS認証に変更する
SSHの問題がとりあえず解決したあと、懲りたのでHTTPS認証に変更しました。
変更の仕方は次の2通りです。

①CUIで`git remote set-url origin https://xxx`を実行する

```terminal
$ cd [プロジェクトフォルダ]\.git
$ git remote set-url origin https://xxx
```

②IDEで設定する
VCS→Git→Remotes を選択し、URLをhttpsに変更すればOKです。

![VCS_Git_Remotes.png](https://qiita-image-store.s3.amazonaws.com/0/209042/f9d2d7aa-6377-8d7f-fb09-bb4f3d7f4785.png)

![GitRemotes.PNG](https://qiita-image-store.s3.amazonaws.com/0/209042/9c204e1a-87c4-9b0f-6e6f-62ac398ac93a.png)

やっていることは同じなので、お好きな方でどうぞ。

# まとめ
* 特に理由が無ければ、 HTTPS でcloneする
* Windows で SSH 使う場合は、SSH executable を Native にしておく

最後に、アドバイスをいただいたpimientitoさん、meronさんに感謝申し上げます。
お読みいただきありがとうございました。


[^1]: ちょっと古いので、最新環境で修正されているのかは分かりません。すみません。