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
は問題なく通る - ローカルリポジトリのコミットは問題なくできる
モザイク掛けてますが、GitHubのフィンガープリントなので別に隠す必要はなかったりします。
とにかく接続するために取った対策
個人ではにっちもさっちも行かなかったので、Twitterやリアルでつぶやいたところアドバイスをいただきました。これらを基に取り急ぎ対策を行いました。
URL, 引数の入力に誤りが無いか
→ [プロジェクト名]/.git/config を確認し、url = xxx.gitに誤りがないことを確認。
[remote "origin"]
url = git@github.com:Hide-KC/xxx.git
fetch = +refs/heads/*:refs/remotes/origin/*
FTP/HTTP でプロトコルが合っているか
→ SSH公開鍵認証方式なのでたぶん大丈夫。公開鍵もGitHubに登録してあることを確認。
文字コードが接続元と先で合致しているか
→ 文字コードは設定するような箇所が見つけられなかったのでたぶん大丈夫。
git.exe をフルパス指定したらどうか
→ 指定しても結果は変わらず。
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です。
やっていることは同じなので、お好きな方でどうぞ。
まとめ
- 特に理由が無ければ、 HTTPS でcloneする
- Windows で SSH 使う場合は、SSH executable を Native にしておく
最後に、アドバイスをいただいたpimientitoさん、meronさんに感謝申し上げます。
お読みいただきありがとうございました。
-
ちょっと古いので、最新環境で修正されているのかは分かりません。すみません。 ↩