Как создать псевдоним тега в Git?
У меня есть псевдоним команды Git для извлечения последнего тега из репозитория:
~/.gitconfig
:
checkout-latest = !git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
Так что я могу использовать его в правильно помеченных репозиториях, например так:
$ git checkout-latest
У меня есть псевдонимы команды для команды извлечения:
~/.gitconfig
:
co = checkout
checkout-latest
не работает с псевдонимами команды для оформления заказа:
$ git co-latest
git: 'co-latest' is not a git command. See 'git --help'.
Как я могу настроить Git так, чтобы я мог использовать последний как псевдоним тега, который указывает на программно определенный последний тег? Я хотел бы использовать это так:
$ git checkout latest
а также
$ git co latest
Обратите внимание, что в подкомандах и теге нет никаких черт в моих желаемых вариантах.
3 ответа
Единственное решение такого рода вещей, о которых я могу думать, это git
функция оболочки, которая "отправляет" на основе аргументов.
Что-то вроде этого:
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
Комбинации слишком сложны для этого сейчас (хотя, вероятно, это можно сделать).
Git уже может использовать псевдонимы тегов в том смысле, что вы можете создать новый тег, который указывает на тот же коммит, что и другой тег.
То, что вы, кажется, хотите, это макро-псевдоним; чтобы Git узнал специальное слово типа latest
и динамически заменить это тегом.
Поскольку это, вероятно, не произойдет без изменения Git, вы можете заставить оболочку сделать это, и выполнить интерполяцию через $(...)
подстановка команд:
git checkout $(latest)
latest
это просто сценарий оболочки или функция, которая динамически вычисляет тег и печатает его на стандартном выводе.
Другая идея состоит в том, чтобы просто иметь фактический latest
тег установлен как псевдоним в репо. Когда новое изменение помечено, latest
подталкивается к этому (через git tag -F
). Разумеется, такая пометка - это не ускоренная перемотка вперед, поэтому репо в восходящем направлении должен это разрешить.
Git псевдонимы не могут ссылаться на другие псевдонимы.
Вы можете сделать это с помощью другого уровня косвенности:
co-latest = !git checkout-latest "$@"