В нашем репозитории git есть несколько аннотированных тегов. Старые теги содержат поддельные сообщения, которые мы хотели бы обновить, чтобы они соответствовали нашему новому стилю.
% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.
В этом примере мы хотели бы, чтобы сообщения v1.x выглядели как сообщения v2.0. Кто-нибудь знает, как мы это сделаем?
git tag -m "A message" --edit v1.0
было бы достаточно. Смотрите мой ответ нижеfatal: tag 'v6.6.2' already exists
с помощью2.17.0
.Ответы:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Это создаст новый тег с тем же именем (перезаписав оригинал).
источник
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
когда хотите заменитьold tag
Чтобы обновить сложное сообщение, просто укажите параметр аннотированного тега с помощью
-a
или параметр подписанного тега с помощью-s
:Откроется редактор с содержимым вашего старого сообщения с тегом .
источник
git tag <tag name> <tag name>^{} -f -a
Это улучшение: без
^{}
него будет создан новый объект тега, который ссылается на старый объект тега, где оба они будут иметь одинаковое имя тега.<tag name>^{}
разрешит тег / ссылку, пока не найдет первый хеш коммита.источник
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Вы можете сделать это, удалив свой тег и воссоздав его, подделав дату и автора:
Вся история:
Опираясь на ответ Sungram (первоначально предложенный в качестве редактирования):
1. Принятый ответ
Это улучшение по сравнению с ответами Энди и Эрика Ху . Их ответы создадут новый объект тега, который ссылается на старый объект тега, и оба будут иметь одно и то же имя.
Чтобы проиллюстрировать это, рассмотрим следующее:
2. Улучшение Sungram
Использование
<tag name>^{}
в качестве второго аргументаgit tag
вместо этого удалит все предыдущие теги с тем же именем.Рассмотрим продолжение предыдущего терминального сеанса:
3. Сохранить дату
Наконец, если вы хотите сохранить дату исходного тега в качестве даты обновленного тега, используйте магию awk (или аналогичную) или просто вставьте вместо нее нужную дату. Следующее является заменой для второго примера (в противном случае исходная дата будет потеряна из-за переопределения):
Ссылки:
SO: быстрый список объектов в базе данных git
SO: изменить дату принятия тега git
Awk: учебник и введение
SO: фильтровать вывод по первому токену строки и извлекать остаток строки с помощью awk
SO: Как поместить комментарий строки bash в многострочную команду
4. Сделай сам
В качестве альтернативы обновлению тегов вы можете просто удалить их и создать их заново. Как оказалось, обновление просто добавляет новый тег и указывает на старый, или, альтернативно, просто неявно удаляет старый и создает новый, чтобы указать на тот же коммит в любом случае.
Вы можете достичь этого, выполнив:
Вот
[optional]
необязательное поле;<required>
это обязательное поле Конечно, вы можете добавить любые флаги послеgit tag
команды, как обычно.источник
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
@ Решение Энди
это неправильно . После этого, с
Команда, мы увидим теги стека с тем же именем.
Он добавляет новый тег с тем же именем тега и новым сообщением при коммите
<tag-name>
. Но это не удаляет старый тег. Это особый случай этой команды:Но так
<old-tag>
же, как с<tag-name>
.Правильное решение простое, просто обновите тег в порядке.
Помните, только ОДИН здесь.
Если мы хотим изменить тег, а это не так
HEAD
, нам нужен дополнительный<commit>
аргумент.источник
git show <tag>
и вижу все предыдущие выпуски.HEAD
проходит, пропуская лишний<commit>
, открытый тег становится пустым. Я ожидал, что старый тег просто отредактирует. Есть ли способ?git tag <commit> <tag-name> -f -a
поменяла местами <commit> и <tag-name>? Это выглядит так при сравнении с другими ответами и документами, но я не эксперт.В Git 2.17 (Q2 2018) появится альтернатива созданию нового тега с опцией
git tag <tag name> <tag name> -f -m "<new message>"
"git tag
" изучил явный "--edit
", которая позволяет дополнительно редактировать сообщение, переданное через "-m
" и "-F
".См. Коммит 9eed6e4 (06 февраля 2018 г.) Николаса Морея-Шаземартина (
nmorey
) .(Слиты Junio C Hamano -
gitster
- в фиксации 05d290e , 06 марта 2018 года)Добавьте
--edit
опцию, которая позволяет изменять сообщения, предоставленные-m
или-F
, аналогичным образомgit commit --edit
.источник
--edit
этого адреса к ОП?-f
флаг также добавлен, то--edit
будет редактировать сообщение и изменять метку времени, верно?Вы должны будете пометить снова, используя
-f
флаг силы.источник
Используя ответы выше, это мой псевдоним для одной строки
.gitconfig
. Заменяет существующий тег и сохраняет дату фиксации.Улучшения?
источник
tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
Если вы используете графический интерфейс, как SmartGit просто
источник