警告:注釈付きタグのタグメッセージは保持されません。
概要
変更が必要なタグごとに:
- タグを表すコミットに時間をさかのぼります
- タグを削除する(ローカルおよびリモート)
- これにより、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