CẢNH BÁO: Điều này sẽ không lưu giữ các thông báo thẻ cho các thẻ được chú thích.
Tóm lược
Đối với mỗi thẻ cần được thay đổi:
- Quay ngược thời gian để cam kết đại diện cho thẻ
- Xóa thẻ (cục bộ và từ xa)
- Điều này sẽ biến "Bản phát hành" của bạn trên GitHub thành Bản nháp mà bạn có thể xóa sau đó.
- Thêm lại thẻ cùng tên bằng cách sử dụng một lệnh gọi ma thuật đặt ngày của nó thành ngày của cam kết.
- Đẩy các thẻ mới có ngày tháng cố định lên GitHub.
- Truy cập GitHub, xóa mọi bản phát hành hiện là bản nháp và tạo lại các bản phát hành mới từ các thẻ mới
Trong mã:
# 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
Chi tiết
Theo Cách gắn thẻ trong Git :
Nếu bạn quên gắn thẻ bản phát hành hoặc phiên bản quảng cáo, bạn luôn có thể gắn thẻ trở về trước như sau:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
Và trong khi điều đó hoàn toàn có thể sử dụng được, nó có tác dụng đưa các thẻ của bạn ra khỏi thứ tự thời gian, điều này có thể làm hỏng các hệ thống xây dựng tìm kiếm thẻ "mới nhất". Nhưng đừng sợ. Linus nghĩ về mọi thứ:
# 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"
Tuy nhiên, nếu bạn đã thêm thẻ, bạn không thể sử dụng ở trên với git tag -f existingtag
hoặc nếu không, git sẽ phàn nàn khi bạn cố gắng hợp nhất:
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.
Thay vào đó, bạn phải xóa cục bộ thẻ:
git tag -d 1.0.1
Đẩy xóa từ xa:
git push origin :refs/tags/1.0.1
Trên GitHub, tải lại Bản phát hành — bản phát hành hiện đã được đánh dấu là "Bản nháp" —và xóa bản nháp.
Bây giờ, hãy thêm thẻ đã cập nhật dựa trên các hướng dẫn ở trên và cuối cùng đẩy thẻ kết quả vào GitHub:
git push --tags
và sau đó đi và thêm lại thông tin Bản phát hành GitHub một lần nữa.
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