如何解决忽略已删除分支的名称已损坏的引用



我遇到了一些分支问题,最终在GitHub和本地删除了与该分支相关的所有内容,但我一直得到:

$ git branch
warning: ignoring ref with broken name refs/heads/deleted_branch (conflicted copy 2020-12-18 151952)

我已经完成了git branch -d deleted_branchgit branch -D deleted_branch,删除了GitHub上的分支(然后是fetch&pull(,但deleted_branch似乎仍然存在。如何解决此问题?非常感谢。

此名称:

deleted_branch (conflicted copy 2020-12-18 151952)

看起来像是由Dropbox这样的共享系统创建的东西。

Git需要完全控制自己的存储库永远不要将Git存储库放在共享文件夹中1Git有自己的机制来进行适当控制的共享,这是我们用git fetchgit push实现的。(你可能会把git fetch藏在git pull后面,但它仍然是git fetch。(

如何[删除坏的分支名称]?

坏名字不是deleted_branch,而是deleted branch (conflicted copy 2020-12-18 151952)。删除它的唯一方法可能是手动执行。

不过,首先要确保Git存储库是所有非Git程序无法访问的,这些程序可能会自动篡改它,并试图解决文件的冲突副本。换句话说,将任何共享文件夹的Git存储库移出。请注意,Git存储库通常位于工作树顶层的.git子目录(子文件夹(中。如果移动整个工作树,包括它的所有子文件夹,也会移动Git存储库。

现在您可以尝试git branch -d "deleted branch (conflicted copy 2020-12-18 151952)",其中的双引号保护括号和空格不受shell的影响。如果这有效,那就好了。如果没有,您将需要手动方法。

您可以输入存储库本身:.git文件夹。在这个文件夹(目录(中,有一个子文件夹名为refs。其中还有另一个子目录heads。这个第二个子目录包含每个"子目录"的文件;活动的";树枝列出目录的内容应该会显示错误的名称。例如,在我的一台机器上的一个好的Git存储库中,我得到:

$ ls -l .git/refs/heads
total 4
-rw-r--r--  ... 41 Dec 13 07:47 master

(此存储库只有一个活动分支,名为master(。请注意,我实际上并没有麻烦输入.git目录;我在工作树的顶层执行这些操作,使用.git/refs/访问那里的文件。

如果坏名字出现在这里:

-rw-r--r--  ... 41 <date> deleted_branch (conflicted copy 2020-12-18 151952)

然后可以使用系统的文件删除工具将其删除。在这个盒子上(类似Linux/Unix(,是rm:

$ rm ".git/refs/heads/deleted_branch (conflicted copy 2020-12-18 151952)"

引号保护括号和空格不受shell的影响,因此rm命令可以获得完整的名称。这将删除包含分支哈希ID的内部文件——每个文件都有40个字节长,这就是为什么大小为41个字节:40个字节加一个换行符——删除了文件后,分支现在应该不存在了。

如果没有,或者一开始就不在那里,那么Git可能有";包装的";裁判也是。在这种情况下,在文本编辑器中打开文件.git/packed-refs,该编辑器不会破坏内容(不会将其转换为UTF-16-LE,也不会添加字节顺序标记,也不会将行尾更改为CRLF而不是仅LF,等等(。删除与错误分支名称对应的行,然后保存文件(仍为纯文本(。


1什么,从来没有<插入整个G&这里的S例程>在一些罕见的情况下,你可以这样做,只要你确切地知道你在做什么,以及Git内部是如何工作的,但即使这样,这通常也是一个坏主意。我已经用VirtualBox虚拟机做了一个实验,它可以工作,但有时会变得非常慢——太慢了,最好只使用Git的获取/推送系统。

最新更新