速度慢原因归纳:
- WSL本身drivefs速度慢,/mnt基于9p网络协议挂载,小文件速度极慢
- Zsh主题速度慢,调用大量git命令、多次进行diff,进一步加剧速度慢的问题
调查:Zsh到底执行了多少git命令
- 发现oh-my-zsh在agnoster中先parse_dirty调用了一遍git status,又用zsh自带的vcs_info调用了两次diff,还有8次其余的git调用
- 我重写了agnoster的相关代码,改为仅使用git status —porcelain命令一次实现,速度有所提高
- 但agnoster仍然是同步执行的git,效果有限
解决: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不合法等
#!/bin/sh
export WSLENV=$WSLENV:GIT_CONFIG_PARAMETERS/w
export GIT_CONFIG_PARAMETERS="'core.autocrlf=input'"
exec "git.exe" "$@"