如何在 Git 中给标签起别名?

Posted

技术标签:

【中文标题】如何在 Git 中给标签起别名?【英文标题】:How to alias a tag in Git? 【发布时间】:2015-02-16 09:48:22 【问题描述】:

我有一个 Git 命令别名来检查存储库中的最新标签:

~/.gitconfig:

checkout-latest = !git checkout $(git describe --tags `git rev-list --tags --max-count=1`)

所以我可以在这样正确标记的存储库中使用它:

$ git checkout-latest

我有 checkout 命令的命令别名:

~/.gitconfig:

co = checkout

checkout-latest 不适用于结帐的命令别名:

$ git co-latest
git: 'co-latest' is not a git command. See 'git --help'.

如何配置 Git 以便可以使用 latest 作为指向以编程方式确定的最新标签的标签别名?我想这样使用它:

$ git checkout latest

$ git co latest

请注意,在我想要的变体中,子命令和标签之间没有破折号

【问题讨论】:

如果你想让co-latest 工作,只需添加它:co-latest = !git checkout-latest。如果不维护一个实际的标签latest,我认为你不能做你想做的事。 是的,可以。但我既不想在每个 repo 中维护 latest 标签,也不想混淆子命令和标签的语法。 co-latestgit 的子命令,而git checkout latest 是命令、子命令和标签别名。我认为在子命令级别引用标签的东西很难看。 我明白了。我认为这是您得出的任意区别,并且严重限制了您可以使用别名做的事情,但这不是我的电话。我不相信您可以在这里做您想做的事情(除非您将 git 本身包装在一个 shell 函数中并根据子命令和“tag/ref”参数进行调度。 【参考方案1】:

Git 别名不能引用其他别名。

但是,您可以通过另一层间接来完成此操作:

co-latest = !git checkout-latest "$@"

【讨论】:

虽然很有趣,但这并不能回答我的问题。我不想创建更多的子命令别名。我想摆脱我拥有的那个,并在标签级别使用别名获得更好的功能。【参考方案2】:

我能想到的唯一解决方案是git shell 函数,它根据参数进行“调度”。

类似这样的:

git() 
    if [ "$1" != checkout ] || [ "$#" -ne 2 ]; then
        git "$@"
        return
    fi

    local lastrev lasttag

    case $2 in
        :latest)
            lastrev=$(git rev-list --tags --max-count=1)
            set -- checkout "$(git describe --tags "$lastrev")"
        ;;
    esac

    git "$@"

标签别名需要像普通引用一样无效才能安全使用check-ref-format

此构造允许通过 case 语句添加任意标签“别名”。

如果你想使用标签“别名”,这个函数非常限制了可以使用的参数。具体来说,你不能通过任何。命令必须git checkout <alias>。现在解析所有有效的git checkout 组合实在是太难了(尽管它可能已经完成了)。

【讨论】:

【参考方案3】:

Git 已经可以为标签设置别名,因为您可以创建一个新标签,该标签指向与另一个标签相同的提交。

你似乎想要的是一个宏别名;让 Git 识别像 latest 这样的特殊词,并用标签动态替换它。

由于不修改 Git 可能不会发生这种情况,因此您可以让 shell 执行此操作,并通过 $(...) 命令替换进行插值:

git checkout $(latest)

latest 只是一个 shell 脚本或函数,可以动态计算标签并将其打印在标准输出上。

另一个想法是在 repo 中安装一个实际的 latest 标签作为别名。当标记了新的更改时,latest 会被推送到该更改(通过git tag -F)。当然,这样的标记是一种非快进更改,因此上游 repo 必须允许这样做。

【讨论】:

以上是关于如何在 Git 中给标签起别名?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Python 中给一个类型起别名?

git,远程库操作,git命令行命令

git,远程库操作,git命令行命令

oracle 如何给多表查询的结果集起别名 有一个三张表的查询语句,有数据,但加上别名后就报错了

如何在 VS2003 中给 .net 1.1 dll 起一个强名称

在 shell 中为 git 别名转义标签登录