VSCodeでRemoteSSHを使用しているときにgitが使えなくなった場合の解決法

先日書いた[gitコマンドでMissing or invalid credentials. Error: connect ECONNREFUSED…が出たときの解決法](https://qiita.com/hachiware1024/items/ba91448a475c531dcdf7)の改訂版みたいなものです。

:::note warn
ここに記載する内容は非公式のため、実際にやる場合は自己責任でお願いいたします。
:::

# 概要
VSCodeのRemoteSSHを使用していると、gitが使えなくなるという現象があります(原因不明)。
この現象が発生した場合の解決法を備忘録として記載します。

# 現象


1. VSCodeのGUIでPull、Push等を行おうとすると、ポップアップで以下のエラーが表示される
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/6edcc647-4afb-0904-bcbc-a1462b92eb6f.png)
    `err: fatal: could not read Username for 'https://***.com': No such device or address`

1. コマンドのログを表示させると`Missing or invalid credentials.`のログが出ている


# 解決法
以下の手順で解決します。

1. コマンド実行
    ```
    $ rm ~/.vscode-server/.cli*
    $ rm ~/.vscode-server/code-*
    $ rm -r ~/.vscode-server/cli
    $ rm -r ~/.vscode-server/data
    ```
2. リロード
    VSCode上で`Ctrl`+`Shift`+`P`から`Developer: Reload Window`を選択して再読み込みを行う

# 調査
## 環境
- EC2(AmazonLinux2023)に対してVSCodeの機能拡張(RemoteSSH)で接続
- gitの使用方法
    - git拡張のGUI
    - ターミナルからのコマンド実行

## 再現手順

- GUIからPULL/PUSHを試みる

## 事象
1. VSCodeのGUIでPull、Push等を行おうとすると、ポップアップで以下のエラーが表示される
1. コマンドのログを表示させると`Missing or invalid credentials.`のログが出ている
1. ターミナルからのgitコマンドも効かない
1. 環境変数`GIT_ASKPASS`をクリアするとターミナルからはgitコマンドが通るようになる
1. GUIからのPULL/PUSH等は依然エラーになる
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/04666e14-c3a3-81b7-e7a5-b99344823619.png)

## 原因
色々調べた結果、VSCodeのRemoteSSHを使うと作成される.vscode-serverという仮想環境が問題という結論に至りました。
この仮想環境の状態がおかしくなると問題が発生すると思うのですが、実際どういった条件で仮想環境がおかしくなるのかまでは不明です。

## 原因詳細
※推測が多分に含まれます。

VSCodeはRemoteSSHを使った際、**勝手に** 接続先に.vscode-serverという仮想環境(ディレクトリ)を作成するようです。

### 正常時の動作
gitコマンドを実行した際に利用される環境変数`GIT_ASKPASS`には.vscode-server内のファイルが設定されていますので、正常時はGUIとターミナルは共に以下のような経路で実行されると推測されます。
![success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/4f8ec9e0-a6b9-d594-1ce0-ced692d2cc17.png)

### 問題発生時の動作

問題発生時は共にエラーになりますので、.vscode-serverの中の何かがおかしくなった可能性が高いです。
![failed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/9c00dac6-88e3-abb8-8019-076dc6a44710.png)

### 対策としてGIT_ASKPASSを空にした時の動作

ここでGIT_ASKPASSを空にすると、gitコマンドは.vscode-serverを介さなくなるため、ターミナルからの実行は成功するようになります。
![askpass_empty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496019/0e9d579a-a8a2-c542-9eae-0b99cd8b9429.png)

GIT_ASKPASSを空にした状態でSettingsからGIT_ASKPASSの上書きを禁止にすると、GUIからのPULL/PUSH等は完全にできなくなります。(おそらくGUIからの実行は.vscode-serverを介することでうまくいくようになっている)

## 対策
.vscode-server内の何かが悪いので、クリアします。

```
$ ls -la ~/.vscode-server/
total 17368
drwxrwxr-x.  5 ec2-user ec2-user      157 Jan 30 05:26 .
drwx------. 14 ec2-user ec2-user    16384 Jan 30 05:27 ..
-rw-------.  1 ec2-user ec2-user      418 Jan 30 05:26 .cli.cd4ee3b1c348a13bafd8f9ad8060705f6d4b9cba.log
drwxrwxr-x.  3 ec2-user ec2-user       21 Jan 30 05:20 cli
-rwxr-xr-x.  1 ec2-user ec2-user 17745392 Jan 16 00:26 code-cd4ee3b1c348a13bafd8f9ad8060705f6d4b9cba
drwx------.  6 ec2-user ec2-user       88 Jan 30 05:20 data
drwx------. 15 ec2-user ec2-user    16384 Jan 29 07:04 extensions
```

.vscode-serverの中身を見ると、諸々のファイル群が存在します。
extensionsはRemoteSSHの環境にインストールした拡張機能なので、このディレクトリ以外を削除します。

```
$ rm ~/.vscode-server/.cli*
$ rm ~/.vscode-server/code-*
$ rm -r ~/.vscode-server/cli
$ rm -r ~/.vscode-server/data
```

VSCode上で`Ctrl`+`Shift`+`P`から`Developer: Reload Window`を選択して再読み込みを行えば完了です。


# 参考

- https://qiita.com/coatly/items/a392925346f091b49279
- https://qiita.com/siruku6/items/f1a0846c32647728193b
- https://tech.excite.co.jp/entry/2022/09/27/153341
- https://learn.microsoft.com/en-us/answers/questions/939587/fail-to-ssh-connect-to-ubuntu-vm-using-visual-stud