ВНИМАНИЕ: это не сохранит сообщения тегов для аннотированных тегов.
Резюме
Для каждого тега, который необходимо изменить:
- Вернитесь во времени к фиксации, представляющей тег
- Удалить тег (локально и удаленно)
- Это превратит ваш «Релиз» на GitHub в черновик, который вы позже сможете удалить.
- Повторно добавьте одноименный тег, используя магический вызов, который устанавливает его дату равной дате фиксации.
- Отправьте новые теги с фиксированными датами обратно на GitHub.
- Перейдите на GitHub, удалите все черновые выпуски и заново создайте новые выпуски с новыми тегами.
В коде:
# Fixing tag named '1.0.1'
git checkout 1.0.1 # Go to the associated commit
git tag -d 1.0.1 # Locally delete the tag
git push origin :refs/tags/1.0.1 # Push this deletion up to GitHub
# Create the tag, with a date derived from the current head
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 1.0.1 -m"v1.0.1"
git push --tags # Send the fixed tags to GitHub
подробности
Согласно How to Tag in Git :
Если вы забыли пометить выпуск или исправление версии, вы всегда можете пометить его задним числом следующим образом:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
И хотя это идеально подходит для использования, это приводит к тому, что ваши теги располагаются в хронологическом порядке, что может сказаться на системах сборки, которые ищут «последний» тег. Но не бойтесь. Линус обо всем подумал:
# This moves you to the point in history where the commit exists
git checkout SHA1_OF_PAST_COMMIT
# This command gives you the datetime of the commit you're standing on
git show --format=%aD | head -1
# And this temporarily sets git tag's clock back to the date you copy/pasted in from above
GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
# Combining the two...
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
Однако, если вы уже добавили тег, вы не можете использовать указанное выше, git tag -f existingtag
иначе git будет жаловаться при попытке слияния:
Rammy:docubot phrogz$ git push --tags
To git@github.com:Phrogz/docubot.git
! [rejected] 1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to 'git@github.com:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.
Вместо этого вы должны удалить тег локально:
git tag -d 1.0.1
Отправьте это удаление удаленно:
git push origin :refs/tags/1.0.1
На GitHub перезагрузите выпуски - выпуск теперь отмечен как «Черновик» - и удалите черновик.
Теперь добавьте тег задним числом в соответствии с приведенными выше инструкциями и, наконец, отправьте полученный тег в GitHub:
git push --tags
а затем снова добавьте информацию о выпуске GitHub.
git tag -l | while read -r tag; do `git checkout $tag && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a $tag -m"$tag"`; done; git push --tags