【问题标题】:Git refs head file is invalidGit refs 头文件无效
【发布时间】:2014-09-26 09:11:30
【问题描述】:

当我想在我的存储库中运行 git branchgit log 或其他命令时,我遇到了以下错误:

fatal: Failed to resolve HEAD as a valid ref.

当我打开.git/HEAD 时,我看到了我期待的分支,因为这是我最后一个工作的分支:

ref: refs/heads/refactoring

当我在.git/refs/heads/ 中打开任何文件时,我总是会发现一行包含这样的字符串:

2d73344af3d39ab9c89df71f6696a1b0b65cdca9

但如果我打开.git/refs/heads/refactoring,我看到的只是一堆零:

0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 00

显然,当它的 HEAD 文件中没有信息时,Git 无法对该分支进行操作。

那么两个问题:

  1. 怎么会这样?
  2. 如何以正确的方式恢复它?

我要求一个正确的方法,因为我能想到的是:

  1. 由于损坏的分支仍处于签出状态,请手动复制所有文件。
  2. 将 HEAD 文件中的 ref 更改为工作分支。
  3. 删除损坏的分支。
  4. 签出具有相同或不同名称的新分支。
  5. 从备份中添加文件并提交。

但这听起来对我来说太老套了。

有什么想法吗?

【问题讨论】:

  • 您不必手动复制文件。只需创建一个新的(临时)分支。
  • 当 HEAD 仍然指向无效分支时我不能
  • 不幸的是,我无法重现该问题,如果我尝试重现,我会收到不同的错误消息。但是,如果它有效,我认为您的解决方案不会是 hacky。您处于损坏的存储库中,因此您可能必须执行一些不寻常的步骤来修复它。如果它有效,您也可以提供它作为答案。它可能会帮助其他有同样问题的人。
  • 您可以手动更改 HEAD 文件以指向有效分支。删除损坏的分支文件并创建一个新的。
  • @Zeeker:我就是这么做的。但是,如果我想提交曾经属于损坏分支的更改,我会得到:error: inflate: data stream error (unknown compression method) error: unable to unpack 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 header fatal: 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 is not a valid object

标签: git version-control


【解决方案1】:

我能够恢复我的分支,我是这样做的:

  1. 我备份了我的文件。
  2. 由于 repo 仍在损坏的分支上签出,我无法使用 git checkout validbranch 在分支之间进行更改。我必须通过命令行设置分支:echo ref: refs/heads/validbranch > .git/HEAD
  3. 显然,我在损坏的分支中所做的所有更改现在都可以在它们实际上不应该出现的有效分支中看到。
  4. 我创建了一个新分支restorebranch 并希望将更改提交到该分支。但这引发了以下错误:error: inflate: data stream error (unknown compression method) error: unable to unpack 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 header fatal: 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 is not a valid object
  5. 所以我运行了git fsck --lost-found,它指向了损坏的文件:fatal: loose object abe0fd1236d488160187b91dbf4adeed31104355 (stored in .git/objects/ab/e0fd1236d488160187b91dbf4adeed31104355) is corrupt。我手动删除了那个文件。我不得不多次运行git fsck --lost-found,因为它一次只指向一个损坏的文件。我需要手动删除大约 10 个损坏的文件。
  6. 最后我能够提交到restorebranch。我将备份粘贴到我的工作目录中。令我惊讶的是,我的工作分支似乎没有任何变化。所以我不知道我实际删除了什么样的对象。
  7. 当我想使用git branch -D 删除损坏的分支时,它告诉我error: branch 'refactoring' not found.,即使在我运行git branch 时它清晰可见。为了解决这个问题,我手动删除了.git/refs/heads/corruptbranch

现在一切都恢复正常了,但在我的 .git 目录中可能仍然有一些曾经属于 corruptedbranch 的已死的、无法访问的对象现在已经丢失了。

【讨论】:

  • 大约每两周清理一次边缘,因此物体应该可以安息。
  • 顺便说一句。由于您只接触了 git 目标文件,因此可以预期您的工作树(您备份的文件)没有更改。您可能丢失了您删除的提交对象,但由于您没有进行硬重置或检查任何文件,您的工作树没有受到影响。我希望这是可以理解的,想消除你的困惑。
  • 好吧,也许我丢失了我对损坏分支所做的所有提交对象?!我删除了大约 10 个对象。它与我对该分支所做的提交次数相加。
  • 提交对象指向树对象,该树对象指向 blob 对象和其他树对象。我假设一些提交出错了,所以相当多的文件被损坏了。看看gitpro一书的Git objects chapter,了解git内部是如何管理历史的。
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2019-10-26
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多