更改git标签的date(或基于它的GitHub发布)

我在GitHub上通过向主分支中的各种提交添加标签来将发布版本添加到我的项目中。

在我的一个项目中,我没有按时间顺序将标签添加到提交中。 (我发现了明显的提交并对它们进行了标记,然后我发现了不太明显提交,并对它们进行了标记。)

现在GitHub显示 v1.0.1是最新版本,前面是v0.7.0,之前 v1.1.2。

它似乎使用标签的创builddate作为发布date,而不是被标记的提交。 如何编辑我的标签,使他们的date与他们正在标记的提交相同?

gitk和GitHub之间的版本和日期的映射

概要

对于每个需要更改的标签:

  1. 回到代表标签的提交
  2. 删除标签(本地和远程)
    • 这将把你的GitHub上的“Release”变成一个你稍后可以删除的草稿。
  3. 使用魔术调用重新添加相同名称的标记,将其date设置为提交date。
  4. 将固定date的新标签推回到GitHub。
  5. 转到GitHub,删除任何现在的草稿版本,并从新的标签重新创build新版本

在代码中:

# 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 

虽然这是完全可用的,但它的作用是将您的标签放在时间顺序上,这可能会影响到寻找“最新”标签的构build系统。 但不要害怕。 莱纳斯想到了一切:

 # 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 COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force 

警告:这会破坏你的上游标签! 确保你知道你在做什么,并确定不要这样做的公共存储库!

打破它…

 # Loop over tags git tag -l | while read -r tag do # get the commit hash of the current tag COMMIT_HASH=$(git rev-list -1 $tag) # get the commit date of the tag and create a new tag using # the tag's name and message. By specifying the environment # environment variable GIT_COMMITTER_DATE before this is # run, we override the default tag date. Note that if you # specify the variable on a different line, it will apply to # the current environment. This isn't desired as probably # don't want your future tags to also have that past date. # Of course, when you close your shell, the variable will no # longer persist. GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH done # Force push tags and overwrite ones on the server with the same name git push --tags --force 

感谢@Mr_and_Mrs_D的build议使用一个单一的推。