Windows で git clone したら Permission Denied が出る
対象
git をコマンドラインで操作する人
ssh で repo をやり取りする人
Windows の OpenSSH クライアント (標準で入っている ssh クライアント) で ssh する人
加えて ssh-agent も行う人
つまり, Git Bash で ssh を行わない人
.ssh/config を作らない人
ここでの解決方法
環境変数 GIT_SSH に Windows の OpenSSH クライアントを追加する
もちろん他の解決方法もあります
理由ってとこで説明
環境
Windows 10 Pro Version 2004 Build 19041.508
git version 2.28.0.windows.1 (chocolatey 経由でインストール)
ssh は Windows 標準のもの
背景
先月の終わりぐらいに作ったデスクトップ (Windows) で作業できるように PowerShell 上で ssh 鍵作って ssh-add で ssh-agent に登録, そのあと GitHub に公開鍵をのっけて ssh -T git@github.com でちゃんと ssh できることを確認したのにもかかわらず, git clone を行った際, permission denied (publickey) を吐かれてしまった.
権限周りは大丈夫なはず (大丈夫ではなかったけど) なのにどうしてできないんだと 30 分ぐらい悩んで直したんで残した.
理由
git のデフォルト仕様だと Git Bash (というより MINGW) 上のパスで最終的にコマンドを解決しようとするため ssh が Windows 標準の方ではなく, そっちの方の実行バイナリから実行してしまう. そのため, Windows 上で鍵を ssh-agent で登録していても, Git Bash の ssh-agent には登録されていないので, 認証エラーが絶対に発生する.
この場合, 以下の解決方法がある
Git Bash の ssh-agent に鍵を登録する
Git Bash と Windows でどっちとも管理されるというデメリットがある
~/.ssh/config (絶対パスでは C:\Users\<user>\.ssh\config かな?) を作成して設定する
config 書く必要があるデメリットがある
正直, これが一番いいとは思います
鍵のファイル名を id_rsa にする
おすすめは全くもってしない
対象見てわかる通り, 自分は Windows 標準の ssh, そして ssh-agent を使用したいので, 上記の方法はあんまりやりたくなかった. で, 色々調べた結果 GitBook 上に以下の記述があった: GIT_SSH は、指定されている場合、GitがSSHホストへ接続する際に ssh の代わりに呼び出されるプログラムです。 これは $GIT_SSH username@host -p <port> <command> のように呼び出されます。 注意事項として、これは ssh の呼び出し方をカスタマイズする最も手軽な方法というわけではありません。追加のコマンドラインパラメタがサポートされないので、ラッパースクリプトを書いて、 GIT_SSH がそのスクリプトを指すようにする必要があります。 その場合は単に ~/.ssh/config ファイルを使用する方が簡単でしょう。
この環境変数 GIT_SSH を設定することにより, ssh の実行プログラムを変えることが可能なので, where ssh | clip するなりして Windows 標準の ssh のパスをコピーし, 環境変数に追加すれば git clone ができるようになる.