在git命令别名中嵌入反引号

时间:2016-02-17 20:58:29

标签: git backticks command-substitution git-alias

我正在尝试创建一个git别名来显示自上一个标记以来的所有提交。我的基础是过去我经常使用的这个答案。

目前,我正在使用git config --global alias.*命令尝试此操作:

git config --global alias.summary 'log `git describe --tags --abbrev=0`..HEAD --oneline'

这会注册一个名为“summary”的新“命令”,它将呈现自上一个标记以来的所有提交消息。

但是,当我运行git summary时,git会抛出此错误消息:

  

致命:含糊不清的论点'`git':未知的修订或路径不在工作树中。

     

使用' - '将路径与修订分开,如下所示:

     

'git< command> [< revision> ...] - [< file> ...]'

对我来说,这看起来像嵌套在反引号中的内部命令git describe --tags --abbrev=0无法正确评估。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

编辑:我原来的建议仍然存在,但也要检查一下: Git alias with shell variable expansions

我建议将其创建为bash函数。我不认为Git会正确地解析这个问题,净效果会是一样的。您可以将其添加到~/.bashrc,以便在shell启动时自动配置它。

gitsummary() {
    git log `git describe --tags --abbrev=0`..HEAD --oneline
}

您可以像执行标准应用一样执行bash功能,所以就像这样

cd /my/git/dir
gitsummary

答案 1 :(得分:0)

我已经发现你需要使用 bang / !运算符来标记别名应该在shell中执行的git。

在旁注中,将git describe --tags --abbrev=0替换为$(git describe --tags --abbrev=0)会导致命令在放入配置文件的[alias]部分之前执行。这会导致alias命令将最新的标记版本烘焙到别名中,而不是动态查找最新的git标记。

IE:如果存储库具有标记1.1.02.0.0,并且我尝试从2.0.0添加一些别名,则会生成以下别名命令:

'!git log 2.0.0..HEAD --oneline;'

这意味着2.0.0现在已被修复为要检查的标记,而非动态查找相关存储库的最新标记。

因此,要修复我的初始git别名,我需要在alias命令的开头添加 !git

git config --global alias.summary '!git log `git describe --tags --abbrev=0`..HEAD --oneline;'