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

Nest backticks inside a git command alias

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

目前,我正在尝试使用 git config --global alias.* 命令,如下所示:

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

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

但是,当我运行 git summary、git 抛出这个错误信息时:

fatal: ambiguous argument '`git': unknown revision or path not in the working tree.

Use '--' to separate paths from revisions, like this:

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

对我来说,这看起来像是嵌套在反引号内的内部命令 git describe --tags --abbrev=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

我发现您需要使用 bang/! 运算符来标记 git 别名应在 shell。

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

IE:如果存储库具有标签 1.1.02.0.0,并且我尝试在 2.0.0 的几次提交上添加别名,它将生成以下别名命令:

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

这意味着 2.0.0 现在已固定为要检查的标签,而不是动态查找相关存储库的最新标签。

因此,为了修复我的初始 git 别名,我需要将 !git 添加到别名命令的开头:

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