LoginSignup
5
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-04

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1