.gitconfig别名解析逻辑不一致问题求助
.gitconfig别名解析逻辑不一致问题求助
大家好,最近我在配置Git别名的时候遇到了一个引号解析的奇怪问题,折腾半天没搞懂,来请教下各位大佬。
事情是这样的:我在.gitconfig里配置了一个chist别名,内容如下:
[alias] chist = log --graph -10 --pretty=format:\"%C(cyan)%h%Creset %<(20,trunc)%s %Cgreen%<(11,trunc)%an%Creset %as %C(yellow)%G?%Creset %<(5,trunc)%GT %Cred%d\"
结果执行git chist的时候直接报错了:
$ git chist fatal: ambiguous argument '%<(20,trunc)%s': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
看起来别名里的双引号直接消失了,%<(20,trunc)%s被当成了git log的独立参数,而不是--pretty=format的一部分。但奇怪的是,如果把别名里的双引号换成单引号,就能正常工作。
为了搞明白原因,我查了Git官方的git-config语法和别名配置相关文档,结果越看越困惑:
- 语法文档提到配置项是
name = value的格式,只有当value需要保留首尾空格时,才需要用双引号包裹。但我的chist别名的value是log --graph...开头,本身没加外层双引号,这个规则好像根本不适用我的场景。 - 别名文档里说,别名的值支持“常规的Shell引号”。于是我做了个小测试,在
.gitconfig里加了两个测试别名:
[alias] test = abc\"def\"ghi text = abc'def'ghi
然后执行git config --list | grep "alias"查看解析结果,得到的输出是:
alias.test=abcdefghi alias.text=abc'def'ghi
这就很矛盾了!如果真的支持常规Shell引号,那test别名里的双引号应该像Shell里那样起到包裹作用,结果却是直接被吃掉了;而text别名里的单引号却完完整整保留了下来,这和我理解的Shell引号逻辑完全不一样。
有没有大佬能帮忙解释下Git别名里的引号解析逻辑到底是怎样的?为什么双引号会被直接移除,单引号却能保留?还有为什么我的chist别名用双引号会报错,换成单引号就正常呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

