如何在 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-latest
是git
的子命令,而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 中给标签起别名?的主要内容,如果未能解决你的问题,请参考以下文章
oracle 如何给多表查询的结果集起别名 有一个三张表的查询语句,有数据,但加上别名后就报错了