删除的Git标签可以自行恢复

Dav*_* C. 7 git git-remote git-tag

我们最近遇到了Git存储库中的标签问题.

我们在本地和远程删除了我们的标签,但每次我们推送或从远程获取时它们都会自动恢复.

我们目前正在组建一个三人小组,当我们认为我们实际上已经摆脱了标签时,有人会做出推动,我们都会再次获得它们.

我们都试过了:

git tag -d 12345
git push origin :refs/tags/12345
Run Code Online (Sandbox Code Playgroud)

其他人遇到过这个问题?

Cod*_*ard 7

再次删除标签,然后执行以下操作:

# verify that the tag was removed form another computer
git fetch --all --prune
Run Code Online (Sandbox Code Playgroud)

Important

如果您使用的是旧版本的git <2.0git push而没有分支名称,则可能会将所有内容推branches & tags送到远程.验证这不是这种情况.


What else can you try?

# push just the tag name without refs/tags/...
git push origin :tagname

# same as above but with the `--delete` flag instead of `:`
git push --delete origin tagname

# as you already did locally - delete the tag as well
git tag -d tagname
Run Code Online (Sandbox Code Playgroud)

Git hooks

验证没有阻止您删除标记的git挂钩.
这是一个示例钩子:

#!/bin/sh

log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$*"; exit 1; }

case $1 in
    refs/tags/*)
        [ "$3" != 0000000000000000000000000000000000000000 ] \
            || fatal "you're not allowed to delete tags"
        [ "$2" = 0000000000000000000000000000000000000000 ] \
            || fatal "you're not allowed to move tags"
        ;;

    # personal touch :-)
    echo "                                         "
    echo "                   |ZZzzz                "
    echo "                   |                     "
    echo "                   |                     "
    echo "      |ZZzzz      /^\            |ZZzzz  "
    echo "      |          |~~~|           |       "
    echo "      |        |-     -|        / \      "
    echo "     /^\       |[]+    |       |^^^|     "
    echo "  |^^^^^^^|    |    +[]|       |   |     "
    echo "  |    +[]|/\/\/\/\^/\/\/\/\/|^^^^^^^|   "
    echo "  |+[]+   |~~~~~~~~~~~~~~~~~~|    +[]|   "
    echo "  |       |  []   /^\   []   |+[]+   |   "
    echo "  |   +[]+|  []  || ||  []   |   +[]+|   "
    echo "  |[]+    |      || ||       |[]+    |   "
    echo "  |_______|------------------|_______|   "
    echo "                                         "
    echo "                                         "
    echo "      This is your last time trying to   " 
    echo "      delete or to move our tags. :-)    "
    echo "                                         "

esac
Run Code Online (Sandbox Code Playgroud)

Git v2.0发行说明

向后兼容性说明

什么git push [$there]时候没说什么推,matching到目前为止我们已经使用了传统的语义(只要那里已经有相同名称的分支,你的所有分支都被发送到远程).在Git 2.0中,默认是现在的simple语义,它推动:

  • 只有当前分支到具有相同名称的分支,并且仅当当前分支设置为与该远程分支集成时,如果您正在推送到同一个远程获取; 要么

  • 只有当前分支到具有相同名称的分支,如果您要推送到通常不从中获取的远程.

您可以使用配置变量push.default来更改此设置.如果您是想要继续使用matching语义的老计时器 ,则可以将变量设置matching为.阅读文档了解其他可能性.