在 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 信息。警告信息关键内容如下所示:
|
|
安装
- Windows 下各种工具软件的管理比较麻烦,最好使用包管理器 Scoop,详细内容可以参考这篇教程。
- 如果已经通过 Win10 的“添加系统功能”安装了 OpenSSH,需要在安装的界面进行卸载
- 如果已经安装了 OpenSSH,可以卸载它防止发生混淆
- 在 Scoop 中搜索安装 win32-openssh
- 使用 Scoop 安装 posh-git(必须)、oh-my-posh(选装但很推荐)
具体 PowerShell 中的安装代码如下:
|
|
写步骤 1 中的教程的时候,仍然使用的是 Scoop 自带的 OpenSSH,至少在写本文的时候无法修复 PowerShell 中使用会出现的 bug。 posh-git 能够改善 PowerShell 中的 git 显示效果,更重要的是省去很多不必要的 git 操作,比如:每次 push 之后输入 SSH 密钥的 passphrase。
配置工作
Scoop 虽然有不少自动配置的脚本内容,但是仍然有很多具体设置要手动进行设置和调整,不然是无法正确运行的。
SSH 客户端配置
虽然,安装 Scoop 的安装提示安装好了 win32-openssh
,但是仍然需要指定 git 使用它替代自带的各种 SSH 相关程序。在系统环境变量中加入 GIT_SSH
变量,然后填入 win32-openssh 的对应的 ssh.exe 完全路径(一般是 ~\scoop\apps\win32-openssh\current\ssh.exe 扩展为完全路径)。
**注意:**不要直接填写版本号,而就应使用
current
目录,这样每次 Scoop 更新了软件之后就无需再修改配置文件的内容。
PowerShell 配置
在 PowerShell 中运行文本编辑器编辑 $PROFILE
文件,找不到的话就新建,地址是:~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
。之后,要在这个文件中进行 git 和 SSH 的相关配置。
posh-git 和 oh-my-posh 不是通过 Install-Module
进行安装的(方便统一进行包管理),需要添加相应的模块文件进行配置。然后,每次启动 PowerShell 都自动运行 SSH 客户端,并且自动运行 ssh-add
命令。相应的文件内容如下:
|
|