为何单台设备上git log的author过滤语法发生变化?
问题原因与解决方法
核心原因
两台设备的差异源于zsh的通配符扩展选项配置不一致,和Git版本无关:
- zsh的
EXTENDED_GLOB选项开启时,会将括号()、竖线|当作通配符解析,此时双引号内的这些字符也会被shell处理,因此需要转义才能让Git接收到正确的正则表达式。 - 若
EXTENDED_GLOB关闭,或开启了QUOTED_GLOB(让引号内的通配符不被解析),则双引号内的括号、竖线不会被shell处理,直接传递给Git,此时无需转义。
大概率是其中一台设备的~/.zshrc或其他zsh配置文件中,新增/修改了setopt EXTENDED_GLOB或unsetopt QUOTED_GLOB这类配置,导致语法处理逻辑变化。
统一语法的解决步骤
1. 确认配置差异
在两台设备的终端分别执行:
setopt | grep -E "(EXTENDED_GLOB|QUOTED_GLOB)"
对比输出结果,找到差异的配置项。
2. 统一zsh配置
根据需求选择任一方式:
- 恢复需要转义的语法:确保两台设备都开启
EXTENDED_GLOB,并关闭QUOTED_GLOB。在~/.zshrc中添加:
执行setopt EXTENDED_GLOB unsetopt QUOTED_GLOBsource ~/.zshrc生效后,即可继续使用带转义的命令。 - 统一为无需转义的语法:关闭
EXTENDED_GLOB或开启QUOTED_GLOB。在~/.zshrc中添加:
生效后,不带转义的命令即可在两台设备正常运行。unsetopt EXTENDED_GLOB # 或者开启QUOTED_GLOB setopt QUOTED_GLOB
3. 跨环境通用的写法(推荐)
不管zsh配置如何,使用单引号包裹正则表达式,shell不会解析单引号内的特殊字符,直接传递给Git:
git log --author='(email1@gmail.com)|(email2@gmail.com)' --after=2023-03-01
这种写法在任何zsh配置下都能正常工作,无需担心转义问题。
内容的提问来源于stack exchange,提问作者Emanuele Alfano
相关产品推荐
相关产品推荐

