我通过在Main分支中的各种提交中添加标签来在我的GitHub项目上添加Releases。
在我的一个项目中,我没有按时间顺序将标签添加到提交中。(我发现了明显的提交并标记了它们,然后我发现了不太明显的较旧的提交并标记了它们。)
现在GitHub的是显示 V1.0.1电流,用它前面v0.7.0,和前述V1.1.2 那个。
它似乎使用标签创建的日期作为发布日期,而不是使用被标记的提交。如何编辑标签,使其日期与标签的提交相同?
我通过在Main分支中的各种提交中添加标签来在我的GitHub项目上添加Releases。
在我的一个项目中,我没有按时间顺序将标签添加到提交中。(我发现了明显的提交并标记了它们,然后我发现了不太明显的较旧的提交并标记了它们。)
现在GitHub的是显示 V1.0.1电流,用它前面v0.7.0,和前述V1.1.2 那个。
它似乎使用标签创建的日期作为发布日期,而不是使用被标记的提交。如何编辑标签,使其日期与标签的提交相同?
Answers:
警告:这将不会保留带注释标签的标签消息。
对于每个需要更改的标签:
在代码中:
# 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
尽管这是完全可用的,但它的作用是使您的标签按时间顺序排列,这可能会干扰寻找“最新”标签的构建系统。但是不要害怕。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
远程推送删除:
git push origin :refs/tags/1.0.1
在GitHub上,重新加载Releases(该版本现已标记为“草稿”)并删除草稿。
现在,根据上面的说明添加回溯标签,最后将结果标签推送到GitHub:
git push --tags
然后再次重新添加GitHub Release信息。
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a $tag -m"$tag" $COMMIT_HASH ; done && git push --tags
git tag -af
makes -d
不需要,您可以留在本地,以便可以检查一切都很好-然后,您可以git push --tags -f
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
$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"
这是根据其他答案中的一些评论得出的一线话:
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提供使用一次推送的建议。
在其他答案的基础上,这里有一个方式,将保护标签消息的第一行
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
参考文献:
-s
不存在一个标志,所以我得到了,error: gpg failed to sign the data
因为我没有为git设置签名。这个错误使我感到有些失望。
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