4

我有一个 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

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

4

3 回答 3

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的组合实在是太难了(尽管它可能会完成)。

于 2014-12-17T22:29:29.157 回答
2

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

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

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

git checkout $(latest)

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

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

于 2014-12-18T22:44:23.453 回答
0

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

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

co-latest = !git checkout-latest "$@"
于 2014-12-17T18:46:28.387 回答