使用Git替换远程标签

87

我在“origin”代码库中有一些标签。 然后我意识到我需要对其中一个标签进行一些更改,并将其推送回我的代码库。 是否可以一次性将现有标签推送到代码库中,还是应该先删除标签?


2
可能是一个重复的问题,参考如何将Git分支上的标签移动到不同的提交? - dskrvk
5个回答

86

虽然您可以删除该标签并将更改推送到远程仓库,但这不应该成为常规做法。

git tag -d tag1
git push origin :refs/tags/tag1

4
还有 git push --delete origin tag1。请参见这里 - cyqsimon
在2023年(v2.37.1)中,如果没有使用--follow-tags,对我来说这是行不通的:git push --follow-tags origin :refs/tags/stage - Mark
为什么这不应该成为一种惯例呢? - Marko

73

所以如果你需要将一个标签(例如:"v0.5")从一个Git分支(例如:"master")移动到另一个提交,可能是一个更新的提交,那么你可以使用-f选项来使用git tag命令:

-f
--force

Replace an existing tag with the given name (instead of failing)

为了创建带注释的标签而不是非注释标签,您可能需要将-f-a一起使用。

示例

  1. 在推送之前,请删除任何远程上的标签。

git push origin :refs/tags/<tagname>

或者以我们的示例为例:

$ git push origin master :refs/tags/v0.5
To git@github.com:org_name/repo_name.git
- [deleted]         v0.5
  • 将标签替换为引用最近的提交(使用 -f 将保存为 git tag -d <tagname> 本地标签删除步骤)。

  • git tag -fa <tagname>
    

    或者以我们的示例为例:

    $ git tag -fa "v0.5" -m "version 0.5"
    Updated tag 'v0.5' (was f55c93f)
    
  • 将标签推送到远程仓库

    git push origin --tags
    

    或者以我们的示例为例:

    $ git push origin master --tags
    Counting objects: 1, done.
    Writing objects: 100% (1/1), 196 bytes | 0 bytes/s, done.
    Total 1 (delta 0), reused 0 (delta 0)
    To git@github.com:org_name/repo_name.git
    * [new tag]         v0.5 -> v0.5
    

  • -f选项对我来说导致了以下错误:错误:无法将一些引用推送到'gitserver....' - undefined

    11

    假设newtag是新标记,oldtag是旧标记。只需执行以下操作:

    # Create new tag that points to the same of old tag
    git tag newtag oldtag
    
    # Remove oldtag
    git tag -d oldtag
    
    # Remove oldtag in remote machine
    git push --delete origin oldtag
    
    # Propapate newtag to remote machine
    git push --tags
    

    使用此解决方案,注释标签中的注释是旧的。如果要更换为另一个注释,则必须删除旧标签 (git tag -d oldtaggit push --delete origin oldtag) 并创建新标签 (git tag -a newtag HASHgit push --tags)。 - somenxavier

    9

    替换标签的更简单方法,可用于远程:

    git tag -f mytagname
    git push -f --tags
    

    即使拉取了更新,其他工作树仍可能保留旧的标签引用。 - jchook
    1
    当你完全控制远程时,作为替代删除远程引用并重新添加相同引用的一步解决方案是不错的选择。因为如果远程引用被删除,则Github发布会中断。 - Iuri Guilherme

    3

    我不确定我理解你的问题,但听起来最简单的方法是删除标签,推送你的更改,然后重新添加标签...


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接