我有一个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
请注意,在我想要的变体中,子命令和标记之间没有没有短划线。
答案 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 "$@"