Edited at

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

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


とにかく接続するために取った対策

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


URL, 引数の入力に誤りが無いか

→ [プロジェクト名]/.git/config を確認し、url = xxx.gitに誤りがないことを確認。


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


SSH executable を Native にしてはどうか

(前節の黄色い枠のちょっと下の部分を、Built-inからNativeに変えてみた)

pullできたあああああああああ!!!!!!

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


SSH executable って何?

IntelliJ IDEAヘルプでは次のように説明されていました。

まずは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


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を実行する

$ cd [プロジェクトフォルダ]\.git

$ git remote set-url origin https://xxx

②IDEで設定する

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

VCS_Git_Remotes.png

GitRemotes.PNG

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


まとめ


  • 特に理由が無ければ、 HTTPS でcloneする

  • Windows で SSH 使う場合は、SSH executable を Native にしておく

最後に、アドバイスをいただいたpimientitoさん、meronさんに感謝申し上げます。

お読みいただきありがとうございました。





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