Zsh环境下创建Git别名失败:提示‘git不是Git命令’
环境/背景
- zsh(v5.9)
- git(v2.48)
- 执行
git --exec-path的结果为/usr/lib/git-core
问题描述
我想创建一个能打印仓库分支详细信息的Git别名,把git branch -vv --list --all和git for-each-ref --sort=-creatordate refs/heads/ --format='%(creatordate:short) %(refname:short)'的功能结合起来。参考相关写法后,写出了如下配置:
[alias] bls = '!f() { git branch -vv --list --all && echo \"\nSorted by creation date:\" && git for-each-ref --sort=-creatordate refs/heads/ --format=\"%(creatordate:short) %(refname:short)\"; }; f'
执行时报错:expansion of alias 'bls' failed; 'git' is not a git command。
我感到困惑,因为其他别名以及!git <command> && <command>格式的别名都能正常运行,但'!f() { git && ; }; f'这类带shell函数的写法却不行。我还尝试了以下几种写法:
[alias] foo = '!f() { git version && echo foo; }; f' # 报错:"fatal: bad alias.foo string: unclosed quote bar = "!f() { git version; echo qux; }; f" # 可正常运行! bls = "!f() { git branch -vv --list --all && echo \"\nSorted by creation date:\" && git for-each-ref --sort=\"-creatordate refs/heads/\" --format=\"%(creatordate:short) %(refname:short)\"; }; f" # 报错:expansion of alias 'bls' failed; 'git' is not a git command
解决方案
参考相关方案后,先实现了多行版本的可用配置:
[alias] bls = ! " \ f () { \ git branch -vv --list --all && \ echo \"\nSorted by creation date:\" && \ git for-each-ref --sort=\"-creatordate refs/heads/\" \ --format=\"%(creatordate:short) %(refname:short)\"; \ }; \ f"
后来确认,将整个字符串用双引号包裹即可解决问题,之前因为全局和本地存在同名别名导致排查受阻。对应的单行版本为:
bls = ! "f () { git branch -vv --list --all && echo \"\nSorted by creation date:\" && git for-each-ref --sort=-creatordate refs/heads/ --format=\"%(creatordate:short) %(refname:short)\"; }; f"
更简洁的最优版本是直接用git for-each-ref覆盖需求,无需shell函数:
bls = ! "git for-each-ref --sort=-creatordate refs/heads refs/remotes --format='%(creatordate:short) %(objectname:short) %(align:40)%(refname:short)%(end) %(contents:subject)'"
内容的提问来源于stack exchange,提问作者chb
相关产品推荐
相关产品推荐

