git - 如何从 'fatal: reference is not a tree: master' 恢复?

标签 git git-branch

我有一个 git 文件夹,它有两个分支,masterworking

由于我无法解释的原因,当我运行 git branch 命令时,我得到了三个分支:

  • 桌面.ini
  • 大师
  • 工作

working 分支是最新的(重置后),并且包含我想要的内容。

desktop.ini 分支不应该存在。当我运行时

git branch -d desktop.ini

它说它不存在,不能删除。也不能 checkout 。 Git 存储库中的每个文件夹中都有一个 desktop.ini 文件,因为它是存储存储库的 Google Drive 文件夹。

然而,主要问题是我无法再访问 master 分支。每次我尝试

git checkout master

我回来了

fatal: reference is not a tree: master.

如果我尝试删除它,我会得到

error: couldn't look up commit object for refs/heads/master

手动检查后,该文件确实存在于正确的目录中,并且里面有一个头。

我还尝试创建一个新的 master 分支,但被告知名为“master”的分支已经存在。最后,运行 git log 给出了最近的提交,然后

error: could not read c7d68...blah blah
fatal: failed to traverse parents of commit aed8af.....

是否有任何简单的方法来恢复 master 分支?

更新:将 head 从工作分支复制到 master 分支,我现在可以再次访问 master。但是每个 git status 都会返回

error: could not read c7d68.....
error: could not read c7d68.....
fatal: Failed to traverse parents of commit aed8......

我需要采取行动来纠正这个问题吗?

最佳答案

我今天早上自己遇到了这个问题。

在我的例子中,我在 Windows 主机上运行 Ubuntu 虚拟机。 Ubuntu VM 用于开发,但我正在使用的文件实际上位于与主机操作系统共享的目录中。

Windows 不允许将 desktop.ini 文件添加到共享目录中的所有目录...包括 .git 目录及其所有子目录。 Git 在不希望第三方操纵内容的地方看到这些文件;所以当我执行 git branch 时,我得到了一个与提问者非常相似的列表。

这里的关键是这些显然不是真正的分支。它们只是 Git 期望能够对目录内容进行简单枚举以查找存在哪些分支的地方的文件。当您尝试做一些更重要的事情时,例如删除这个新的 desktop.ini 分支,它会失败,因为它不是真正的分支。

我通过删除 Windows 添加到 .git 目录结构中的所有 desktop.ini 文件非常简单地解决了这个问题。

一旦我这样做,幻影分支就消失了,一切正常(在我的情况下,它搞砸了 git-flow,因为 git-flow 在 .git/refs/release 中看到了文件作为当前正在发布的分支)。如果我继续在 Windows 主机文件系统中托管这些文件,我确实希望这些文件能够恢复。

可能有更永久的方法来防止这种情况,但我还没有做到。

关于git - 如何从 'fatal: reference is not a tree: master' 恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632720/

相关文章:

python - 尝试 git Push 时 Bitbucket 错误日志

git - 如何从 git 存储库的历史记录中恢复整个目录?

linux - 为什么 branch checkout 在 Windows 上这么慢,而在 Linux 上这么快?

git - GitHub上的origin和upstream有什么区别?

git - 无法使用sourcetree推送子树

Github:来自 pull 请求中出现的不相关分支的提交

git - 有什么办法可以恢复 Jenkins 中的当前构建?

git - 为什么分支名称不能在开头包含 'hash' (#) 字符?

Git 分支删除

git:如何以交互方式逐个分支删除远程仓库中不存在的本地分支?