我有一个 Git 存储库,其中包含一堆不再存在的远程分支,但是当我尝试运行时git fetch -p
出现错误:
error: refs/remotes/origin/bad/branch does not point to a valid object!
我找不到任何方法来解决这个问题。该分支不作为单独的文件存在于.git/refs/remotes
(或其他任何地方;我已使用 进行搜索find
)。尝试删除它git branch -D
不起作用:
$ git branch -D origin/bad/branch
error: branch 'origin/bad/branch' not found.
$ git branch -D bad/branch
error: branch 'bad/branch' not found.
在下面的评论之后,我尝试添加该-r
选项git branch -D
并收到此错误:
$ git branch -D -r origin/bad/branch
error: Couldn't look up commit object for 'refs/remotes/origin/bad/branch'
是否有一些神奇的管道命令我可以用来摆脱这个引用,除了删除整个工作区之外,我真的不想这样做?
此命令将强制删除远程跟踪分支:
但这没有用。
当较高级别的命令太顽固而无法执行您想要的操作时,您可能想尝试较低级别的命令:
手动删除
请注意,通常不建议手动编辑内容。但这可能是必要的。没有任何保证。
据我所知,参考文献目前存储[1]在两个可能的位置:
.git/refs
.git/packed-refs
如果它是一个文件,则
origin/bad/branch
存储在.git/refs/origin/bad/branch
. 只需删除该文件应该是安全的。如果它是一个打包的引用: open
.git/packes-refs
。我还没有阅读此文件格式的任何技术文档,但它看起来就像表单上的文件:在这种情况下,您可能会在如下行中找到参考:
我想你可以删除该行。但为了安全起见,首先要备份整个存储库(和工作树)。
笔记
假设您在存储库上没有无法提交/推送的未完成/未保存的工作,那么通过简单地在本地删除存储库并将其克隆回您的计算机上是否可以轻松解决此问题?
另外,发现这个老问题可能有有用的信息:删除不在远程的分支
git 不是魔法。它需要将其信息存储在某个地方,而这个地方就是 .git 目录。它存储与当前项目/存储库相关的所有配置、对象和引用。
.git/refs
包含您存储库中的所有引用。列出
.git/refs/HEADS
您在本地管理的所有引用。如果您打开这些文件中的任何一个,您都会看到那里有一个哈希,它引用了该分支引用的提交。您可能会查看那里并简单地删除对您所引用的分支的引用。(请记住,如果源(即您的服务器)中不存在该分支,那么您实际上已经丢失了工作,除非您能记住您的分支名称并且 GC 尚未清除悬空引用。)也不难弄清楚,它
.git/refs/remotes/
指的是您已将 git 存储库连接到的所有服务器以及存储在那里的引用。在大多数情况下,您只有一个origin
目录。如果您想查看它的实际效果,请重命名
.git/refs/remotes/origin
目录并运行,git pull
您将看到日志显示有新的分支可供引用。基本上删除本地
.git/refs/HEADS
文件夹中与给您带来困难的分支相对应的有问题的分支,然后重试。