我们可能会遇到这样的情况,一个标签已经在远程仓库存在了,然而在本地我们必须将这个标签移动到另一个新提交上面,但当我们这样做了之后,移动过的标签却无法被推到远程仓库了。

> 0 (devel u=) $ git push --tags
To git@git.github.com:hedzr/devops-op-knife.git
 ! [rejected] release/v0.5.11 -> release/v0.5.11 (already exists)
error: failed to push some refs to 'git@hedzr.git.22os.com:hedzr/devops-op-knife.git'
hint: Updates were rejected because the tag already exists in the remote.

这时,我们需要首先删除那个远程标签,然后重新推送一次就可以了。

要删除一个远程标签,可以执行命令:

git push -v origin :refs/tags/release/v0.5.11

这是一个有点神异的命令,类似的诡异语法在git中其实多到令人麻木,所以也就一般般了。

我们可以为这条命令建立一个别名,今后就能比较便利地做类似操作了:

git config --global alias.rm-remote-tag "! bash -c \"git push -v \${2:-origin} :refs/tags/\$1\""
# 现在,可以这样:
git rm-remote-tag release/v0.5.11
git re-remote-tag release/v0.5.11 non-origin-remote-if-u-want-it