为什么git remote prune origin删除我的本地标签?

时间:2016-01-08 23:15:17

标签: git git-remote

我有几个标记引用来自本地分支和远程跟踪分支或这些提交的祖先的提交。

我想在运行origin后删除git fetch上对分支和代码的引用:

git remote prune origin --dry-run

但输出表明它会修剪我的本地标签,即使是由我手动创建的标签,而不是来自任何遥控器的fetch

 * [would prune] origin/git-svn
 * [would prune] origin/ignore/some_branch
 * [would prune] refs/tags/MyLocalTag
 * [would prune] refs/tags/MyLocalTag2

为什么git试图修剪我的本地标签(即使那些指向我的本地分支没有上游的标签)?

3 个答案:

答案 0 :(得分:2)

尝试改为

  • pushing your tags

    git push --tags
    
  • 使用修剪获取:

    git fetch --prune --tags origin
    

git fetch man page提及:

  

在提取之前,请删除遥控器上不再存在的所有远程跟踪参考   如果仅因默认代码自动关注或--tags选项而提取标记,则不会对其进行修剪。

如果出现任何问题,请记住git reflog以恢复错误删除的任何标记。

OP补充道:

  

不幸的是,我没有能力推动回购。但我不需要将标签与上游(原点)相关联;

您可以将其推送到原始仓库的fork或任何clone -mirror副本。我的观点是将他们推向一些回购。

  

为什么我不能只指向一个不会在git remote prune origin上删除的本地分支?

它们不应该被删除(见下一点)

  

让我想到我正在创建错误的标签(git tag foo MyLocalBranch)。

就是这样!您创建了lightweight tags,它链接到分支,而不是annotated tags,它将引用分支HEAD提交。

尝试创建标签:

git tag -m "old MyLocalBranch" foo MyLocalBranch

添加评论就足以创建一个带注释的标记,与分支分开:git remote prune origin不会删除它们(首先检查--dry-run),或git fetch --prune --tags (但只有先推动这些标签)。

答案 1 :(得分:2)

我能够再次重现这一点并将问题缩小到remote.origin.fetch配置。我添加了一个refspec,以确保git fetch从遥控器中获取所有标签:

[remote "origin"]
    url = https://<path-to-repo>.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/tags/*:refs/tags/*

据我所知,这与设置tagopt = --tags非常相似,因为正在运行git fetch origin会将所有标记复制到.git/refs/tags。但是,在配置文件中包含此refspec会产生意外的副作用,导致git remote prune origin修剪所有本地标记

我提交了Dispatcher已经遇到一系列补丁,以便在文档中更好地解释这一点,以及(具有讽刺意味的)新标志,专门启用删除标记的行为而不需要额外的refspec远程的获取配置。

答案 2 :(得分:0)

从git 2.17开始,有一个fetch.pruneTags config setting。我的设置为true,并将其设置为false可以解决我的本地标签丢失问题。