WSL Git加速

大类
Env
技术标签
环境增强
优先级
Medium
开始日期
May 17, 2021
状态
Maintaining
Public
Public
最后更新
Apr 23, 2022

速度慢原因归纳:

  • WSL本身drivefs速度慢,/mnt基于9p网络协议挂载,小文件速度极慢
  • Zsh主题速度慢,调用大量git命令、多次进行diff,进一步加剧速度慢的问题
 

调查:Zsh到底执行了多少git命令

  • 调查方法:zsh -x或set -x
  • 发现oh-my-zsh在agnoster中先parse_dirty调用了一遍git status,又用zsh自带的vcs_info调用了两次diff,还有8次其余的git调用
  • 我重写了agnoster的相关代码,改为仅使用git status —porcelain命令一次实现,速度有所提高
  • 但agnoster仍然是同步执行的git,效果有限
  • 换用powerlevel10k完美解决
 

解决:Git本身速度问题

  • Git本身会遍历文件夹,而源码文件夹往往小文件多,wsl性能差
  • 解决思路:将一部分WSL的Git调用转为Windows的Git调用
    • 对于不在/mnt下的git repo,自然是不需要加速的
    • 对于clone,由于不知道repo的大小,可以直接使用Windows版git
    • 对于status、diff、add、commit、reset等各种涉及到大量文件操作的常用命令
      • 白名单模式:仅对于大repo开启加速,但由于不能很好判断大repo,效果不好
      • 黑名单模式:对于小repo设置flag避免被加速,实际使用中效果甚佳

额外配置:

  • Git For Windows自带的vim版本落后,且不使用用户目录的.vimrc,因此建议用scoop安装vim,并随后使用git config配置core.editor,配置后在bash中可直接使用Windows vim,体验良好
 

问题:CRLF - core.autocrlf

  • Windows下core.autocrlf为true,意为所有的LF均会被转为CRLF
  • 在Linux下使用Windows的git.exe,导致Linux下checkout的文件全是
    • 影响bash脚本interpreter的识别,提示^M不合法等
  • 通过一个小wrapper解决:
    • #!/bin/sh export WSLENV=$WSLENV:GIT_CONFIG_PARAMETERS/w export GIT_CONFIG_PARAMETERS="'core.autocrlf=input'" exec "git.exe" "$@"