更改 git 标签的日期(或基于它的 GitHub Release)

Posted

技术标签:

【中文标题】更改 git 标签的日期(或基于它的 GitHub Release)【英文标题】:Change date of git tag (or GitHub Release based on it) 【发布时间】:2014-03-11 09:51:48 【问题描述】:

我通过向 Main 分支中的各种提交添加标签来将 Releases 添加到我在 GitHub 上的项目中。

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

现在GitHub is showing v1.0.1 为当前版本,v0.7.0 在其前面,v1.1.2 在 那个之前。

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

【问题讨论】:

【参考方案1】:

警告:这将不会保留带注释标签的标签消息。

总结

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

    及时回到代表标签的提交 删除标签(本地和远程) 这会将您在 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

虽然这完全可用,但它的效果是使您的标签不按时间顺序排列,这可能会与寻找“最新”标签的构建系统发生冲突。但不要害怕。 Linus 想到了一切:

# 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

Push that deletion远程:

git push origin :refs/tags/1.0.1

在 GitHub 上,重新加载版本(该版本现已被标记为“草稿”)并删除草稿。

现在,根据上面的说明添加回溯标签,最后将生成的标签推送到GitHub:

git push --tags

然后再去重新添加 GitHub Release 信息。

【讨论】:

这是一个 bash 脚本,用于删除和重新添加 git repo 中的每个标签: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 使用 git tag -af 使 -d 不再需要,您可以留在本地,以便检查一切是否正常 - 然后您可以 git push --tags -f 感谢@vmrob,这很有效(尽管我不得不多次输入我的 GitHub 密码)。 @Mr_and_Mrs_D 很好的建议和将此操作限制为一次推送的好方法。考虑到这一点,我认为生成的(未经测试的)单行将是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 这适用于 PowerShell 的 git shell,但您必须以不同的方式设置环境变量,并在两行中​​进行:$env:GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800"git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33" 【参考方案2】:

这是基于另一个答案中的一些 cmets 的单线:

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 提出使用单次推送的建议。

【讨论】:

很好,谢谢。我对此进行了修改以修复一些带有混合 0.0.1 和 v0.0.1 格式的标签的存储库,这些格式对我造成了一些问题。我最初的尝试是制作所有来自当前日期的新标签,所以这真的很有帮助。 gist.github.com/petertwise/3802f392aa5f2d71143b5da8d02e47e0【参考方案3】:

在其他答案的基础上,这是一种保留标记消息的第一行

的方法
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH ; done
git tag -l -n1           #check by listing all tags with first line of message
git push --tags --force  #push edited tags up to remote

负责保存消息的位是:

COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)

head -n1 将占用旧提交消息的第一行。您可以将其修改为-n2-n3 等以获得两三行。

如果您只想更改一个标签的日期/时间,您可以通过以下方式分解单行代码以在 bash shell 中执行此操作:

tag=v0.1.0
COMMIT_HASH=$(git rev-list -1 $tag)
COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)
COMMIT_DATE=$(git show $COMMIT_HASH --format=%aD | head -1)
GIT_COMMITTER_DATE=$COMMIT_DATE git tag -s -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH

参考资料:

Print the message of a git tag Get first line of a shell command's output

【讨论】:

这太好了,谢谢。但是,在更改单个标签的命令中,单行中不存在 -s 标志,所以我得到了 error: gpg failed to sign the data,因为我没有为 git 设置签名。这个错误让我有点失望。 感谢您的黄金解决方案,没有一种解决方案能像您的那样奏效。伟大的工作和巨大的帮助【参考方案4】:

似乎在新版本的git(2.33.0测试)中,当你git tag时,新标签的日期将设置为提交日期。

因此,您可以删除标签并重新创建它而无需设置环境变量,它也可以工作。

$ tag_commit=$(git show-ref v0.1.0 | cut -d' ' -f1)
$ git tag -d v1.0.0  # Remove tag locally
$ git push --delete origin v1.0.0  # Remove tag on remote
$ git tag v1.0.0 "$tag_commit"
$ git push --tags

不过,这不允许您指定消息。只要您这样做,就会使用当前日期。

【讨论】:

使用 git 版本 2.33.1 的 git 标签不会为我创建基于提交版本的标签。

以上是关于更改 git 标签的日期(或基于它的 GitHub Release)的主要内容,如果未能解决你的问题,请参考以下文章

GitHub Desktop Git

GitHub Desktop Git

在 GitHub Actions 中添加基于日期的标签

Git“会计” [重复]

五开始Github和码云之旅,新手如何上路

git和github的重要性