ПОПЕРЕДЖЕННЯ: Це не збереже повідомлення тегів для анотованих тегів.
Підсумок
Для кожного тегу, який потрібно змінити:
- Поверніться в часі до коміту, що представляє тег
- Видалити тег (локально та віддалено)
- Це перетворить ваш "Випуск" на 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
Деталі
Відповідно до тегу в 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