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

时间:2016-02-22 22:33:15

标签: git git-remote git-tag

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

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

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

我们都试过了:

{{1}}

其他人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:7)

再次删除标签然后执行此操作:

# verify that the tag was removed form another computer
git fetch --all --prune

<强> Important

如果你使用的是较旧版本的git <2.0,没有分支名称的git 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

<强> 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
  

Git v2.0发行说明

     

向后兼容性说明

     

git push [$there]没有说要推送什么时,我们已经使用了   到目前为止传统的 matching 语义(所有分支都已发送   只要已经存在同名分支,就可以到远程控制台   在那边)。在Git 2.0中,默认为 simple 语义,   推动:

     
      
  • 只有当前分支到同名的分支,并且只有   当前分支设置为与该远程集成时   分支,如果你正在推送到同一个遥控器;或

  •   
  • 只有当前分支到具有相同名称的分支,如果您   正在推送到一个不是你常去的地方的遥控器。

  •   
     

您可以使用配置变量push.default进行更改   这个。如果你是一个想要继续使用的老人    matching 语义,您可以将变量设置为 matching ,   例。阅读文档以了解其他可能性。

答案 1 :(得分:0)

一种方便的方式一次解决所有标签的问题:

1)要一次完成,可以从任何本地存储库中完成

git push <remoteName> :<tagToDelete>
# (for example) git push origin :tag_foo_bar

2)然后,从涉及的每个本地仓库中完成

git tag -d `git tag -d` && git fetch -t

这将列出然后删除存储库标签的所有本地副本,然后从远程重新获取它们。