Как мне отредактировать существующее сообщение тега в git? - PullRequest
191 голосов
/ 19 октября 2011

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

Ответы [ 8 ]

223 голосов
/ 19 октября 2011

git tag <tag name> <tag name>^{} -f -m "<new message>"

Это создаст новый тег с тем же именем (перезаписав оригинал).

74 голосов
/ 03 января 2013

Чтобы обновить сложное сообщение, просто укажите параметр аннотированного тега с -a или параметр тега со знаком с -s:

git tag <tag name> <tag name>^{} -f -a

. Откроется редактор с содержимымВаше старое сообщение тега .

37 голосов
/ 08 мая 2014

git tag <tag name> <tag name>^{} -f -a

Это улучшение по сравнению с Энди и ответами Эрика Ху.Их ответы создадут новый объект тега, который ссылается на старый объект тега, где у них обоих будет одинаковое имя тега.

<tag name>^{} будет разрешать тег / ссылку до тех пор, пока не найдет первый хеш коммита.

29 голосов
/ 12 марта 2015

TL; DR

Вы можете сделать это, удалив свой тег и воссоздав его при подделке даты и автора:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

Вся история:

Построение на Sungram ответ (первоначально предлагался в качестве редактирования):

1.Принятый ответ

Это улучшение по сравнению с Энди и Эриком Ху .Их ответы создадут новый объект тега, который ссылается на старый объект тега, и оба будут иметь одно и то же имя.

Чтобы проиллюстрировать это, рассмотрим следующее:

> git tag tag1 tag1 -f -a  # accepted answer
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
260ab7928d986472895b8c55e54569b3f3cb9517 tag1
a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Original description]

[tagged commit details]

2.Улучшение Sungram

Использование <tag name>^{} в качестве второго аргумента git tag вместо этого удалит все предыдущие теги с тем же именем.

Рассмотрим продолжение предыдущего сеанса терминала:

> git tag tag1 tag1^{} -f -a  # suggested improvement
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

[tagged commit details]

3.Сохраните дату

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

> GIT_COMMITTER_DATE="$(git show tag1 |                              # get info about the tag cascade including the date original of the original tag
> awk '{
>     if ($1 == "Date:") {
>         print substr($0, index($0,$3))
>     }
> }' |                                                               # extract all the dates from the info
> tail -2 | head -1)"                                               `# get the second to last date, as the last one is the commit date` \
> git tag tag1 tag1^{} -a -f                                         # finally, update the tag message, but save the date of the old one
>
> git rev-list --objects -g --no-walk --all
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
e18c178f2a548b37799b100ab90ca785af1fede0 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17
> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Updated description]

[tagged commit details]

Ссылки:

4.Сделай сам

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

Вы можете достичьэто путем выдачи:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

Здесь [optional] - необязательное поле;<required> - обязательное поле.Конечно, вы можете добавить любые флаги после команды git tag, как обычно.

10 голосов
/ 07 июля 2016

@ Решение Энди

git tag <tag-name> <tag-name> -f -a

- это неправильно .После этого с помощью команды

git show

мы увидим стековые теги с тем же именем.

Добавим новый тег с тем же именем тега и новое сообщение при коммите <tag-name>.Но это не удаляет старый тег.Это особый случай этой команды:

git tag [<commit> | <old-tag>] <tag-name>

Но только <old-tag> совпадает с <tag-name>.


Правильное решение простое, просто обновить тег можно.

git tag <tag-name> -f -a

Запомните, только ONE здесь.

Если мы хотим изменить тег, который не HEAD, нам нужен дополнительный аргумент <commit>.

git tag <commit> <tag-name> -f -a
5 голосов
/ 11 марта 2018

мы бы хотели, чтобы сообщения v1.x выглядели как сообщения v2.0

В 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 - in commit 05d290e , 06 Mar 2018)

tag: добавить --edit опция

Добавить параметр --edit, который позволяет изменять сообщения, предоставленные -m или -F, так же, как git commit --edit.

4 голосов
/ 05 января 2016

Используя ответы выше, это мой псевдоним с одной строкой для .gitconfig Заменяет существующий тег и сохраняет дату фиксации.

[alias]
    tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '"

Улучшения

3 голосов
/ 19 октября 2011

Вам придется снова пометить тегом -f.

git tag v1.0 -f -m "actual message"
...