gitコマンドでMissing or invalid credentials. Error: connect ECONNREFUSED…が出たときの解決法


新しく書いた記事の方が対応としては良い気がします。こちらの記事は備忘録として残しておきます
https://qiita.com/hachiware1024/items/aadbf19a8e37fd2fd3a1

# 概要

gitコマンドを実行したところ、`Missing or invalid credentials.
Error: connect ECONNREFUSED ...`というエラーが出るようになってしまい、対処方法と原因の調査をしたので記載します。
対処法については先人の記事がありますので、そちらを参考にしてください。この記事では原因の深掘りをメインに書いていきます。


# 解決法

## 環境変数をクリアする

https://qiita.com/obilixilido/items/046d3224a214d793c0b3

こちらにドンピシャな答えが載っていました。
以下のコマンドで解決。他にも方法はあるようですが、割愛します。

```
$ export GIT_ASKPASS=
```

## GIT_ASKPASSを上書きしないようにする
以下の手順で設定を変更します。

- VSCodeのSettingsでASKPASSを検索すると出てくる`Use Integrated Ask Pass`のチェックを外す
    - ![{B99F7301-29C6-4884-B6B6-56B82D6C263D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/585d4f9c-9f99-4aac-756a-176a71f0d388.png)
- `Ctrl`+`Shift`+`P`で`Developer: Reload Window`を選択して再読み込みを行う
- 念のためターミナルも新しいものを開く
:::note warn
この設定の結果、GUIでのremote側とやり取り(PULL等)ができなくなったので、GUIを使用している方はご注意ください。
:::


# 個人的興味による調査
## 環境
AWS上のEC2(Linux)にWindowsPCからVSCodeのRemoteSSHで接続して操作を行っていました。

## 現象
gitコマンドの中でもリモートとやり取りが発生するコマンド(git pullやgit pushなど)を実行すると以下のエラーが出るようになりました。

```
Missing or invalid credentials.
Error: connect ECONNREFUSED /run/user/1000/vscode-git-xxxxxxxxx.sock
    at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '/run/user/1000/vscode-git-xxxxxxxxx.sock'
}
Missing or invalid credentials.
Error: connect ECONNREFUSED /run/user/1000/vscode-git-xxxxxxxxx.sock
    at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '/run/user/1000/vscode-git-xxxxxxxxx.sock'
}
remote: Unauthorized
fatal: Authentication failed for 'https://....'
```

追記 エラー内容は異なりますが、同じような現象だったのでこちらのエラーも載せておきます。

```
$ git pull origin main
Missing or invalid credentials.
Missing pipe
Missing or invalid credentials.
Missing pipe
remote: Unauthorized
fatal: Authentication failed for 'https://xxxx.git
```

## 解決方法からの逆算

`export GIT_ASKPASS=`で解決するということは、GIT_ASKPASSに何かおかしな値が入っているということです。
では、何が入っているのか？
問題が発生する状態で当該の環境変数に何が入っているか見てみます。

```
$ echo $GIT_ASKPASS
/home/ec2-user/.vscode-server/cli/servers/Stable-xxxxxxxxxxxxxxxxxxxxxxxxxxx/server/extensions/git/dist/askpass.sh
```

VSCodeでSSH接続した場合に作成されるディレクトリの中のシェルスクリプトを参照しているようです。

ファイルの中身を見てみます。


```
#!/bin/sh
VSCODE_GIT_ASKPASS_PIPE=`mktemp`
ELECTRON_RUN_AS_NODE="1" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" VSCODE_GIT_ASKPASS_TYPE="https" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_MAIN" $VSCODE_GIT_ASKPASS_EXTRA_ARGS $*
cat $VSCODE_GIT_ASKPASS_PIPE
rm $VSCODE_GIT_ASKPASS_PIPE
```
何やっているかわからないので一つ一つ見ていきます。

- `` VSCODE_GIT_ASKPASS_PIPE=`mktemp` ``
    - mktempはユニークなファイルを作るコマンド(https://nxmnpg.lemoda.net/ja/1/mktemp)
    - ここはmktempの実行結果(mktempで作られたファイル名)をセットしている
- ```ELECTRON_RUN_AS_NODE="1"```
    - 通常のNode.jsプロセスとしてプロセスを開始するためのフラグをONにする
    - https://www.electronjs.org/ja/docs/latest/api/environment-variables
- `VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE"`
    - よくわからない
- `VSCODE_GIT_ASKPASS_TYPE="https"`
    - httpsでの処理を行う
- `"$VSCODE_GIT_ASKPASS_NODE"
    - /home/ec2-user/.vscode-server/cli/servers/Stable-xxxxxxxxxxxxxxxxxxxxxxxxxxx/server/node
- `"$VSCODE_GIT_ASKPASS_MAIN"`
    - /home/ec2-user/.vscode-server/cli/servers/Stable-xxxxxxxxxxxxxxxxxxxxxxxxxxx/server/extensions/git/dist/askpass-main.js
- `$VSCODE_GIT_ASKPASS_EXTRA_ARGS`
    - 何もセットされていない

詳細は不明ですが、Node.jsを使ってaskpass-main.jsを実行した結果をmktempで作成したファイルに流し込んでどこかに渡している感じでしょうか。
では、askpass-main.ts出は何をやっているのか。実際のコードを見てみます。

https://github.com/microsoft/vscode/blob/main/extensions/git/src/askpass-main.ts

[fatalのところ](https://github.com/microsoft/vscode/blob/8b8b5bb62a7e4674d0dfbb393576b72bef6950a6/extensions/git/src/askpass-main.ts#L10)に見慣れた文字列があります。
もう少し進めてみると、[httpsを指定した場合](
https://github.com/microsoft/vscode/blob/8b8b5bb62a7e4674d0dfbb393576b72bef6950a6/extensions/git/src/askpass-main.ts#L43)の処理部分があります。
引数を引っ張ってきているのですが、この辺でこけているっぽいので引数が悪さしているのかな。という感じです。実際どんな引数が渡されているかまでは確認できませんでした。

というわけで、この辺りに原因があるんだろうなーということがわかりましたので調査を終了します。

# GIT_ASKPASSが上書きされる原因と対策

この記事を書いている途中で毎回GIT_ASKPASSが上書きされるという事象に当たりまして、根本的に解決できないか調べることにしました。

## 原因
`GIT_ASKPASS`という環境変数自体はGitの機能として設定ファイルの`core.askpass`の値をセットするようです。
ただ、私の環境では`core.askpass`は設定されていません。

https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0

諸々調べていると、この設定はVSCodeの組み込みのgit拡張がよかれと思って入れているんだとか…。

https://code.visualstudio.com/docs/terminal/advanced#_extension-environment-contributions

## 調査
VSCodeが設定しているのならば、Settingsに定義があるのでは？と思い、Settingsを開いてGIT_ASKPASSを検索してみると、それらしき項目がありました。

![{7DFD6EC1-A8B2-43CC-9619-8E02A3AE7171}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/cd8f865b-727e-c607-711e-e81fdfa19272.png)

Googleさんで翻訳してみると、`Git: 統合されたAskパスを使用する
統合バージョンを使用するために GIT_ASKPASS を上書きするかどうかを制御します。`となります。
これぞまさしく求めていた設定！ということでチェックを外してVSCodeを再起動してみます。

再起動後に`echo $GIT_ASKPASS`で設定状態を確認……セットされていました泣
※今考えると、再起動後のカレントディレクトリが再起動前のものと一緒だったので、キャッシュが効いていたのかもしれません。


何回かやっても上書きされるので、PC再起動してVSCodeを立ち上げて再確認……無事セットされなくなりました！

# 最終的な解決方法
VSCodeを使っていて突如 `Missing or invalid credentials.・・・・`が出るようになりましたが、以下の手順で解決しました。

1. 環境変数(GIT_ASKPASS)のクリア
1. VSCodeのSettingで`Git: Use Integrated Ask Pass`のチェックを外す
1. `Ctrl`+`Shift`+`P`で`Developer: Reload Window`を選択して再読み込みを行う
1. 念のためターミナルも新しいものを開く

# 参考サイト

- https://qiita.com/obilixilido/items/046d3224a214d793c0b3
- https://qiita.com/daigo-takayama/items/8ef6352350eeaff92774
- https://qiita.com/furusin_oriver/items/f030d1eaa9e7b54233c3
- https://qiita.com/ko1nksm/items/98952723d7a71799673c
- https://nxmnpg.lemoda.net/ja/1/mktemp
- https://www.electronjs.org/ja/docs/latest/api/environment-variables
- https://github.com/microsoft/vscode/blob/main/extensions/git/src/askpass-main.ts
- https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
- https://code.visualstudio.com/docs/terminal/advanced#_extension-environment-contributions