在Git中,是否可以从另一个别名引用别名?

20

假设我在.gitconfig中有这样一个别名:

alias.showlog = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' 

现在我希望有一个类似于这样的别名:

alias.sl = showlog --abbrev-commit

当我尝试运行命令git sl时,它会提示不识别showlog命令。

我知道可以像其他别名那样复制相同的命令,但我想知道是否有可能在别名中引用另一个别名?


我认为不是。你试过了吗? - Jepessen
我试着把这两行代码放在我的.gitconfig文件中;也许有一种特殊的标记来做到这一点,但是我没有找到任何信息。 - рüффп
我电脑里没有git。如果“alias.sl = alias.showlog --abbrev-commit”也不能用,我找不到其他解决方案。 - Jepessen
2
这将在Git 2.20中实现(于2018年第四季度发布)。请参见下面的答案 - VonC
2个回答

31
在 Git 2.20 之前的版本中: 并不是这种方式,但你可以通过别名在 shell 中运行一个命令,从而再次运行另一个实例的 git ,解决第二个别名:
alias.sl = !git showlog --abbrev-commit
在2.20或更高版本中,请参见VonC的回答

1
工作正常,但退出日志视图时返回“error: git showlog --abbrev-commit died of signal 13”的错误。
为了防止这种情况,可以在运行shell命令的别名末尾添加一个“exit”命令,如下所示:
sl = !git showlog --abbrev-commit && exit
- Brice
@briceshatzer:有趣的是,信号13是SIGPIPE。由于“…|less”通常会导致“…”部分以SIGPIPE退出,因此Shell通常不会抱怨SIGPIPE。我记得最近在Git中看到了一些SIGPIPE处理更改,但添加一个额外的Shell命令就可以让Shell吃掉SIGPIPE,并且应该在任何地方都可以使用。 - torek
不再需要使用Shell。请参考@vonc的回答。 - Joshua Goldberg

17

更新于2018年第四季度:是的,使用Git 2.20是可能的:扩展到另一个别名的别名一直被禁止,但现在可以创建这样的别名了。

请参见fef5f7f提交82f71d9提交c6d75bc提交(由Tim Schumacher (timschumi)于2018年9月16日)。
(由Junio C Hamano -- gitster --2018年10月16日提交的506ee60合并)

alias: 添加对别名的别名支持

别名只能包含非别名Git命令及其参数,而不能包含其他用户定义的别名。通过在处理第一个别名后中断循环来防止解析更多(嵌套)别名。
Git因命令未找到而失败。

允许通过不在run_argv()处理第一个别名后中断循环来解析嵌套别名。
相反,继续循环直到handle_alias()失败,这意味着没有可以处理的其他别名。 通过将替换命令存储在cmd_list中并检查以前是否已替换该命令来防止循环别名。

所以...现在将有可能:

git config alias.nested-internal-1 nested-internal-2
git config alias.nested-internal-2 status
git nested-internal-1

那将是一个 git status 命令。


从 Git 2.30 (2021 年第一季度) 开始,命令行自动完成脚本(在 contrib/ 中)学会了扩展命令别名。

详情请参见 e4c75ed 提交记录(2020年11月12日),以及由 Felipe Contreras (felipec)c2822a8 提交记录9414938 提交记录 中进行的更新。
(由 Junio C Hamano -- gitster --fd6445a 提交记录 中合并)

completion: bash: support recursive aliases

由 Felipe Contreras 签署

可以使用递归别名,例如:

l = log --oneline
lg = l --graph  

因此,该完成应该也能够检测到这样的别名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接