Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么git remote prune origin会删除我的本地标记?_Git_Git Remote - Fatal编程技术网

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

为什么git remote prune origin会删除我的本地标记?,git,git-remote,Git,Git Remote,我有几个标记引用来自本地分支和远程跟踪分支的提交,或者这些提交的祖先 运行git fetch后,我想删除对origin上的分支和标记的引用: git远程修剪源--干运行 但输出表明它将删除我的本地标记,即使是由我手动创建的标记,而不是从任何远程fetched: * [would prune] origin/git-svn * [would prune] origin/ignore/some_branch * [would prune] refs/tags/MyLocalTag * [wo

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

运行
git fetch
后,我想删除对
origin
上的分支和标记的引用:

git远程修剪源--干运行

但输出表明它将删除我的本地标记,即使是由我手动创建的标记,而不是从任何远程
fetch
ed:

 * [would prune] origin/git-svn
 * [would prune] origin/ignore/some_branch
 * [would prune] refs/tags/MyLocalTag
 * [would prune] refs/tags/MyLocalTag2
为什么git试图删减我的本地标记(即使是那些指向没有上游的本地分支的标记)?

因为,
git config fetch.pruneTags false
会有所帮助

见:

默认情况下,它应为false:

Git具有保留数据的默认配置,除非数据被明确地丢弃;这扩展到保留对远程设备上已删除这些分支的分支的本地引用


试试看(2016年)

  • 使用prune获取:

    git fetch --prune --tags origin
    
提到:

提取之前,请删除远程设备上不再存在的任何远程跟踪引用。
如果仅由于默认标记自动跟随或由于
--Tags
选项而获取标记,则不会对标记进行修剪

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


OP补充道:


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

然后,您可以将其推送到fork或原始repo的任何克隆镜像副本。我的意思是把他们推到一些回购协议上

为什么我不能让一个标记指向一个本地分支,而这个分支在git remote prune origin上没有被删除

它们确实不应该被移除(见下一点)

让我觉得我创建了错误的标记(
git tag foo MyLocalBranch

就是这样!您已经创建了链接到分支的,而不是引用分支头提交的

尝试将标记创建为:

git tag -m "old MyLocalBranch" foo MyLocalBranch

添加注释足以创建一个带注释的标记,与分支分开:它们不会被
git remote prune origin
删除(首先使用
--dry run
进行检查),或者使用
git fetch--prune--tags
进行删除(但仅当这些标记首先被推送时).

我能够再次重现这一点,并将问题缩小到
remote.origin.fetch
config。我添加了一个refspec,以确保
git fetch
从远程获取所有标记:

[remote "origin"]
    url = https://<path-to-repo>.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/tags/*:refs/tags/*
[远程“源站”]
url=https://.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
删除所有本地标记


我提交了它,它遇到了一系列补丁,以便在文档中更好地解释这一点,并且(具有讽刺意味的是)新的标志专门支持这种删除标记的行为,而不需要在远程的fetch配置中使用额外的refspec。

从git 2.17开始,有一个。我的标签设置为
true
,设置为
false
可以修复我的本地标签丢失问题。

您的本地标签在哪里?我的意思是,在哪个部门?根据doc的说法,“git prune-从对象数据库中删除所有无法访问的对象”,因此git认为那些标记是无法访问的。@mayo:我创建标记的头部所在的本地分支已通过
git checkout-D
删除。它们就在refs/标记之下,而不是origin/之下。我没有使用
git prune
,我使用的是
git remote prune
,它“删除下所有过时的远程跟踪分支。这些过时的分支已经从引用的远程存储库中删除,但在“remotes/”中仍然在本地可用。”您知道如何在修剪后恢复丢失的标记吗?我没有意识到标签会随着分支一起被删减,并在不直接运行命令的情况下运行命令(记录的输出仅列出已删除的标记,而不列出与它们关联的提交,这将允许我手动恢复。不幸的是,我无法推送到回购。但我不需要将标记与上游(
源代码
)关联。);为什么我不能让一个标记指向一个本地分支,而该分支在
git remote prune origin
上没有被删除?这让我觉得我在某种程度上创建了错误的标记(
git tag foo MyLocalBranch
)@mgiuffrida我已经编辑了答案,并指出了创建一个标记的正确方法,该标记将抵抗
git远程删减源
在完成最初的有问题的删减后,我无法再复制我自己的描述。我仍然不清楚如果轻量级标记包含校验和,为什么会删减它们(指一个无法到达的提交)。我一定是误解了发生的事情。我正在结束问题,但仍然奖励你。@mgiuffrida他们(轻量级标记)将被删除,因为他们所连接的分支将被删除。@BreakingBenjamin不确定。我在来源中看到了这一点:很好的反馈,比我的答案更精确。+1
[remote "origin"]
    url = https://<path-to-repo>.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/tags/*:refs/tags/*