如何在Git中为标签添加别名?

时间:2014-12-17 18:38:30

标签: git shell aliases subcommand

我有一个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不能用于checkout命令别名:

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

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

$ git checkout latest

$ git co latest

请注意,在我想要的变体中,子命令和标记之间没有没有短划线。

3 个答案:

答案 0 :(得分: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组合现在很难为此烦恼(尽管可能已经完成)。

答案 1 :(得分:1)

Git已经可以使用别名标记,因为您可以创建一个新标记,指向与另一个标记相同的提交。

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

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

git checkout $(latest)

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

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

答案 2 :(得分:0)

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

您可以使用另一层间接完成此操作,但是:

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