Как создать псевдоним тега в 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 "$@"
Другие вопросы по тегам