Как переименовать тег Git? - PullRequest
1101 голосов
/ 22 июня 2009

Сегодня я просматривал логи проекта и понял, что некоторое время назад я нажал на имя тега. Есть ли способ переименовать тег? Google не нашел ничего полезного.

Я понимаю, что могу проверить версию с тегом и создать новый тег, я даже попробовал это. Но это, кажется, создает объект тега, который не совсем прав. Для одного,

git tag -l

перечисляет его не по порядку относительно всех других тегов. Я понятия не имею, если это важно, но это заставляет меня поверить, что новый объект тега не совсем то, что я хочу. Я могу с этим смириться, потому что мне действительно важно, чтобы имя тега соответствовало документации, но я бы предпочел сделать это «правильно», предполагая, что есть правильный способ сделать это.

Ответы [ 10 ]

1839 голосов
/ 19 апреля 2011

Вот как я переименую тег old в new:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

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

Наконец, убедитесь, что другие пользователи удаляют удаленный тег. Пожалуйста, скажите им (коллегам) выполнить следующую команду:

git pull --prune --tags
285 голосов
/ 09 декабря 2009

Первоначальный вопрос заключался в том, как переименовать тег, что легко: сначала создайте NEW как псевдоним OLD: git tag NEW OLD, затем удалите OLD: git tag -d OLD.

Цитата о "Git way" и (in) вменяемости не соответствует действительности, потому что она говорит о сохранении имени тега, но заставляет его ссылаться на другое состояние хранилища.

106 голосов
/ 27 апреля 2013

В дополнение к другим ответам:

Сначала вам нужно создать псевдоним из старого имени тега, указывающего на исходный коммит:

git tag new old^{}

Затем вам нужно удалить старый локально :

git tag -d old

Затем удалите тег на вашем удаленном местоположении (ах):

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

Наконец, вам нужно добавить новый тег в удаленное местоположение. Пока вы этого не сделаете, новые теги не будут добавлены :

git push origin --tags

Повторяйте это для каждого удаленного местоположения.

Помните, что означает, что изменение тега Git имеет для потребителей пакета!

27 голосов
/ 22 июня 2009

Если он опубликован, вы не можете удалить его (то есть, не рискуя быть заархивированным и обработанным). «Git way» это сделать:

Нормальная вещь. Просто признай, что ты облажался, и используй другое имя. Другие уже видели одно имя тега, и если вы сохраняете одно и то же имя, вы можете оказаться в ситуации, когда два человека имеют «версию X», но на самом деле они имеют разные «X». Так что просто назовите его «X.1» и покончите с этим.

С другой стороны,

Безумная вещь. Вы действительно хотите также назвать новую версию «Х», хотя другие уже видели старую. Так что просто используйте git-tag -f снова, как будто вы еще не опубликовали старый.

Это так безумно, потому что:

Git не изменяет (и не должен) изменять теги позади пользователей. Поэтому, если кто-то уже получил старую метку, выполнение git-pull на вашем дереве не должно просто заставить их перезаписать старую.

Если кто-то получил тег выпуска от вас, вы не можете просто изменить тег для них, обновив свой собственный. Это большая проблема безопасности, поскольку люди ДОЛЖНЫ иметь возможность доверять своим именам тегов. Если вы действительно хотите сделать безумную вещь, вам нужно просто признать это и сказать людям, что вы все испортили.

Любезно предоставлено справочных страниц .

25 голосов
/ 16 июня 2014

Эта вики-страница содержит интересную однострочную строку, которая напоминает нам о том, что мы можем нажать несколько ссылок :

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

и попросить других клонеров сделать git pull --prune --tags

Так что идея состоит в том, чтобы нажать:

  • <new-tag> за каждый коммит, на который ссылается <old-tag>: <refs/tags/old-tag>:<refs/tags/new-tag>,
  • удаление <old-tag>: :<refs/tags/old-tag>

См. В качестве примера " Изменить соглашение об именах тегов в репозитории git? ".

24 голосов
/ 17 ноября 2015

В качестве дополнения к другим ответам я добавил псевдоним, чтобы сделать все это за один шаг, с более знакомым ощущением команды * nix move. Аргумент 1 - это имя старого тега, аргумент 2 - это имя нового тега.

[alias]
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

Использование:

git renametag old new
6 голосов
/ 13 июля 2012

Для любителей приключений это можно сделать одной командой:

mv .git/refs/tags/OLD .git/refs/tags/NEW
3 голосов
/ 27 марта 2019

Следуйте трехэтапному подходу для одного или нескольких тегов.

Шаг 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 готов к изменению имени тега, эти изменения могут быть перенесены обратно в источник, чтобы другие могли их принять.

3 голосов
/ 29 августа 2018

Независимо от проблем, связанных с отправкой тегов и переименованием тегов, которые уже были переданы, в случае, если тег для переименования является аннотированным , вы можете сначала скопировать его с помощью следующей однострочной команды строка:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

Затем вам просто нужно удалить старый тег:

git tag -d old_tag

Я нашел эту командную строку благодаря следующим двум ответам:

Edit:
Возникли проблемы с использованием автоматической синхронизации тегов с настройкой fetch.pruneTags=true (как описано в https://stackoverflow.com/a/49215190/7009806),. Я лично советую сначала скопировать новый тег на сервер и , затем удалить старый. Таким образом, новый тег не удаляется случайным образом при удалении старого тега, и синхронизация тегов хотела бы удалить новый тег , которого еще нет на сервере . Так, например, все вместе получим:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag
1 голос
/ 17 февраля 2017

Легкая часть - переименование локальных тегов. Более трудная часть - отдаленные. Идея этого трюка заключается в дублировании старого тега / ветки на новый и удалении старого без проверки.

Удаленное переименование тега / Удаленная ветвь → преобразование тега: (Примечание: :refs/tags/)

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

Удаленное переименование ветви / Удаленный тег → преобразование ветви: (Примечание: :refs/heads/)

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

Вывод переименования удаленного тега:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
...