在 PowerShell 中正确配置 git 与 OpenSSH

在 Windows 的 PowerShell 中配置 git 和 SSH 的方式和其他操作系统相比有很大的不同,尤其是不正确的配置会遇到各种各样的 bug,需要特别记录以备参考。

本人在使用各种 Windows 的终端模拟器的过程中,发现它们或者有各种各样的小 bug,或者必须额外引入一些用不到的环境文件以模拟 Linux 系统导致体积臃肿。最后,发现微软官方发布的开源终端模拟器 Windows Terminal 配合 PowerShell 更好用些,思考再三决定试用一下看看能否适合日常的办公和学习。但是,在刚刚迁移的时候就碰到了不少的问题,最重要也最麻烦的就是 PowerShell 中 git 与 SSH 的使用。

因为,Windows 的 git 客户端自带的 ssh-agent 程序实际上仍然是 MSYS2 中的对应程序,启动之后返回的 PID 值并不正确。这样,在使用各种自动脚本的时候会出现无法正确锁定 ssh-agent 进程的问题。初看可能是个无关紧要的小 bug,但是实际上这回导致每次重新运行 ssh-agent 就会重新申请一个进程空耗系统资源;而且无法正确暂存 SSH 链接要用到的密钥,导致每次 push 操作都要反复输入 passphrase。

而后,使用 Win10 自带的 OpenSSH 工具和 git 进行匹配后又发生了新的问题:OpenSSH 客户端版本过低而且加密协议处理有 bug,每次提交都会发出加密不匹配的 warning 信息。警告信息关键内容如下所示:

1
2
3
...
warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
...
  1. Windows 下各种工具软件的管理比较麻烦,最好使用包管理器 Scoop,详细内容可以参考这篇教程
  2. 如果已经通过 Win10 的“添加系统功能”安装了 OpenSSH,需要在安装的界面进行卸载
  3. 如果已经安装了 OpenSSH,可以卸载它防止发生混淆
  4. 在 Scoop 中搜索安装 win32-openssh
  5. 使用 Scoop 安装 posh-git(必须)、oh-my-posh(选装但很推荐)

具体 PowerShell 中的安装代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 卸载 Scoop 自带的 openssh
scoop uninstall openssh

# 安装 win32-openssh
scoop install win32-openssh
sudo ~\scoop\apps\win32-openssh\current\install-sshd.ps1

# 安装 posh-git 与 oh-my-posh
scoop install posh-git
scoop install oh-my-posh

写步骤 1 中的教程的时候,仍然使用的是 Scoop 自带的 OpenSSH,至少在写本文的时候无法修复 PowerShell 中使用会出现的 bug。 posh-git 能够改善 PowerShell 中的 git 显示效果,更重要的是省去很多不必要的 git 操作,比如:每次 push 之后输入 SSH 密钥的 passphrase。

Scoop 虽然有不少自动配置的脚本内容,但是仍然有很多具体设置要手动进行设置和调整,不然是无法正确运行的。

虽然,安装 Scoop 的安装提示安装好了 win32-openssh,但是仍然需要指定 git 使用它替代自带的各种 SSH 相关程序。在系统环境变量中加入 GIT_SSH 变量,然后填入 win32-openssh 的对应的 ssh.exe 完全路径(一般是 ~\scoop\apps\win32-openssh\current\ssh.exe 扩展为完全路径)。

**注意:**不要直接填写版本号,而就应使用 current 目录,这样每次 Scoop 更新了软件之后就无需再修改配置文件的内容。

在 PowerShell 中运行文本编辑器编辑 $PROFILE 文件,找不到的话就新建,地址是:~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1。之后,要在这个文件中进行 git 和 SSH 的相关配置。

posh-git 和 oh-my-posh 不是通过 Install-Module 进行安装的(方便统一进行包管理),需要添加相应的模块文件进行配置。然后,每次启动 PowerShell 都自动运行 SSH 客户端,并且自动运行 ssh-add 命令。相应的文件内容如下:

1
2
3
4
Import-Module ~\scoop\apps\posh-git\current\posh-git.psd1
Import-Module ~\scoop\apps\oh-my-posh\current\oh-my-posh.psd1

Start-SshAgent -Quiet