事象と解決策
VSCodeのターミナルから git push
しようとしました。
$ git push
remote: Repository not found.
fatal: repository 'https://github.com/username/ripository.git/' not found
...???
結論からになりますが、unset GIT_ASKPASS
と打ったら解消しました。
こちらのサイトのおかげです。感謝。
本件に取り組んだきっかけ
「突然壊れた」なんて言いたくありませんが、正直その感覚でした。
何なら昨日まではできていたのに…
昨日 git push
した時から、今日のこの時までの間に何をしてしまったのか、原因が分からなかったので調べてみようと思いました。
事象の切り分け
まずはログを見てみようと考えました。
VSCodeのターミナルには、OUTPUT
というタブがあります。
そこにGitがログを吐いていました。
git fetch
をしようとして Missing or invalid credentials.
と出ています。
日本語すら怪しい私は、すぐ翻訳サイトに頼りました。
そういえば昨日は、ユーザ名やトークンを入れて認証した覚えがありました。
それが今日は求められていないぞ…?
何となくだけど、VSCodeが怪しい気がしてきました。
調査開始
同事象で検索してみると、解決のためのページがいくつかヒットします。
- リモートリポジトリのURLを
HTTPS
からSSH
に変えれば解決 - URLを登録する際に、ユーザ名と認証トークンを記載すれば解決
私はいま、httpsで接続しようとしてなぜか認証に失敗しています。
上記の通りに SSH
で接続すれば、公開鍵認証方式に切り替わるため、解決しそうです。
また、ユーザ名と認証トークンを予め記載して接続すれば、https
でも認証を通過しそうです。
でも、なんだか負けた気がします…
本質は、ユーザ名やトークンを入れて認証を求められないというところにあるのであって、正しい認証情報をそこに入れれば通るはずです。
調査結果
VSCodeはリモートリポジトリへの認証をどのようにして求めているのか について調べたところ、以下を見つけました。
組み込みの Git 拡張機能はGIT_ASKPASS環境変数を挿入して、VS Code が Git リモートへの認証を処理できるようにします。
GIT_ASKPASS
ってなんだ??
GIT_ASKPASS は設定ファイルの core.askpass の値をオーバーライドします。 これはユーザによる認証情報の入力が必要なときに呼び出されるプログラムで、コマンドライン引数としてプロンプトのテキストを受け取り、応答を標準出力へ返すようになっている必要があります。
まさに、認証情報を求め、受け取り、結果を返すという流れを担っているようです。
つまりそれが表示されなかったということは、GIT_ASKPASS
自体か、呼び出されるはずのプログラムに何らかの不具合が生じ、認証情報の入力を促すことができなかった、
結果、認証情報が未入力のまま git push
しようとしたため怒られた。ということなのではないでしょうか。
あらためて、対応
正直、ログからは何が原因で認証を求めなかったのか、掴むことはできませんでした。
ただ、GIT_ASKPASS
は core.askpass
をオーバーライドしているとのことなので、GIT_ASKPASS
を初期化すれば core.askpass
が使われそうです。
そして、自分は core.askpass
という設定をしていません。
となると、恐らくターミナルからの標準入力を使いそうです。
と、いうことで最終的に unset GIT_ASKPASS
として、環境変数を初期化することで、git push
できるようになりました。
気がかり
今後、GIT_ASKPASS
に依存している何らかの環境を使用してリモートリポジトリへ接続する場合、認証エラーになりそうだなと思います。
まぁ、その時はSSH
を使えば良いかと考えています。
ただ、それを考えると最初から SSH
に切り替えてしまうという対策が一番良かったのかもしれません。