Изменить соглашение об именах тегов в репозитории git?

У меня есть git-репозиторий, который содержит несколько тегов в формате "v1.2.3-rc-4", которые я хотел бы автоматически переименовать в "1.2.3-rc4". Теги существуют как в локальном, так и в удаленном репозиториях.

Я должен уточнить, что числовые компоненты в номере версии должны рассматриваться как переменные. Вышеуказанные значения просто для демонстрации формата тегов.

Есть ли способ автоматизировать это изменение?

1 ответ

Решение

Чтобы перечислить все теги, я бы порекомендовал git for-each-ref с --shell возможность оценить ссылки.
Объедините его с одной строкой, чтобы переименовать / удалить тег.

#!/bin/sh

git for-each-ref --shell --format="ref=%(refname:short)" refs/tags | \
while read entry
do

    # assign tag name to $ref variable
    eval "$entry"

    # test if $ref starts with v
    ref2="${ref#v}"
    if [[ "${ref}" != "${ref2}" ]]; then

        # rename/delete tag
        git push origin refs/tags/${ref}:refs/tags/${ref2} :refs/tags/${ref}
        git tag -d ${ref}
    fi

done

Следуйте трехэтапному подходу для одного или нескольких тегов. Для большого количества тегов вышеприведенный скрипт может быть изменен, чтобы использовать следующие 3 шага в качестве альтернативного решения.

Шаг 1: Определите идентификатор коммита / объекта для коммита, на который указывает текущий тег

     command: git rev-parse <tag name>
     example: git rev-parse v0.1.0-Demo
     example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

Шаг 2: Удалить тег из хранилища

     command: git tag -d <tag name>
     example: git tag -d v0.1.0-Demo
     example output: Deleted tag 'v0.1.0-Demo' (was abcde)

Шаг 3. Создайте новый тег, указывающий на тот же идентификатор фиксации, на который указывал старый тег

     command: git tag -a <tag name>  -m "appropriate message" <commit id>
     example: git tag -a v0.1.0-full  -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
     example output: Nothing or basically <No error>

Когда локальный git готов к изменению имени тега, эти изменения могут быть перенесены обратно в источник, чтобы другие могли их принять.

Другие вопросы по тегам