如何在Git别名中正确使用"$@"将参数传递给git log命令?
解决方案
你遇到的参数传递问题是Git Shell类别名的默认特性导致的:以!开头的Git别名会把用户输入的额外参数直接追加到整行命令的末尾,所以你之前的写法参数会被传递给管道末尾的head而非git log。
要解决这个问题,只需要把整条管道逻辑封装到一个匿名Shell函数中,让参数优先传递给函数内的git log即可。
配置方法
你可以任选以下两种方式之一配置别名:
- 直接编辑全局Git配置文件
~/.gitconfig,在[alias]配置块下添加:
[alias] most-edited = !f() { \ git log --name-status --pretty=format: -- "$@" | \ sed '/^$/d' | \ cut --fields=2- | \ sort | \ uniq --count | \ sort --numeric-sort --reverse | \ head; \ }; f
- 直接在终端执行配置命令自动写入:
git config --global alias.most-edited '!f() { git log --name-status --pretty=format: -- "$@" | sed "/^$/d" | cut --fields=2- | sort | uniq --count | sort --numeric-sort --reverse | head; }; f'
原理解释
- 封装为Shell函数后,你输入的所有参数会作为函数的入参被
"$@"接收,双引号包裹的$@会原样保留带空格的路径等特殊参数,正确传递给git log命令 - 函数定义结束后末尾的
f会触发函数执行,完成整个统计逻辑
配置完成后即可正常执行git most-edited 'foo bar/' baz/类命令,正确查询指定路径下修改次数最多的10个文件。
内容的提问来源于stack exchange,提问作者l0b0
相关产品推荐
相关产品推荐

