Как переименовать тег Git?

Однолинейное решение:

В следующем коде используются URL-адреса объектов, что намного эффективнее, чем URL-адрес данных для просмотра больших изображений (URL-адрес данных - это огромная строка, содержащая все данные файла, тогда как URL-адрес объекта - это просто короткая строка, ссылающаяся на данные файла в памяти):

<img id="blah" alt="your image" width="100" height="100" />

<input type="file" 
    onchange="document.getElementById('blah').src = window.URL.createObjectURL(this.files[0])">

Сгенерированный URL-адрес будет выглядеть следующим образом:

blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345
1106
задан Mark Amery 18 April 2017 в 21:56
поделиться

7 ответов

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

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

285
ответ дан Peter Mortensen 18 April 2017 в 21:56
поделиться

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

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

В качестве альтернативы,

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

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

Git не меняет (и не должен) изменять теги позади пользователей. Так что, если кто-то уже получил старый тег, выполнение мерзавца на вашем дереве не должно просто заставить его перезаписать старый.

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

Все предоставлено man-страницами .

27
ответ дан Peter Mortensen 18 April 2017 в 21:56
поделиться

В качестве дополнения к другим ответам, я добавил псевдоним, чтобы сделать все это за один шаг, с более знакомым ощущением команды * 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
25
ответ дан Jared Knipp 18 April 2017 в 21:56
поделиться

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

mv .git/refs/tags/OLD .git/refs/tags/NEW
6
ответ дан wolfc 18 April 2017 в 21:56
поделиться

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

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

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

git tag -d old_tag

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

Редактировать:
Возникли проблемы с использованием автоматической синхронизации настройки тегов 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
3
ответ дан Olivier 18 April 2017 в 21:56
поделиться

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

Шаг 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
ответ дан vikas pachisia 18 April 2017 в 21:56
поделиться

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

Удаленное переименование тега / Удаленная ветвь → преобразование тега: (Примечание: :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
1
ответ дан zionyx 18 April 2017 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: