Android
GitHub
SSH
AndroidStudio
HTTPS

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. ちょっと古いので、最新環境で修正されているのかは分かりません。すみません。