如何从损坏的git工作文件夹中恢复文件

时间:2015-01-06 20:04:20

标签: git corruption

我遇到了一个不幸的事件,即在切换我没有推送到我的远程存储库的Git分支时获得BSOD。 计算机重新启动并重新登录后,我发现我的工作区已损坏。以下是症状:

  • 分支名称为“(...)”
  • .git目录与标准文件和目录(钩子,信息,日志,对象,引用)一起存在
  • 我做的所有git命令除了clone和init导致“致命:不是git存储库(或任何父目录):。git”
  • “$ git init”没有抛出任何错误,但没有解决问题
  • “$ git fsck --full”导致“致命:不是git存储库(或任何父目录):。git”
  • 工作区中只有部分目录显示TortoiseGit图标表示没有变化,其他目录没有图标,所有文件都没有图标

有人可以帮助我让工作区再次进入工作状态,或者恢复分支或藏匿中的某些文件吗?

3 个答案:

答案 0 :(得分:8)

在我以前的同事的帮助下,我想出了如何从中恢复过来。您可能希望这样做是最后的手段,因为您可能会丢失一些信息,并且由于损坏,这可能不起作用。

让我们将损坏的工作空间命名为“corruptWorkspace”,要修复的工作空间是“fixWorkspace” 您需要做的第一步是创建一个新的工作区来进行恢复并复制对象并参考:

  1. $ mkdir fixWorkspace
  2. $ cd fixWorkspace
  3. $ git init
  4. $ cp ../corruptWorkspace/.git/objects .git -r -a
  5. $ cp ../corruptWorkspace/.git/refs .git -r -a
  6. 从这里你可以恢复分支/提交。

    1. 通过在.git \ refs \ heads或.git \ logs \ HEAD文件中找到要恢复的分支
    2. 在文本编辑器中打开,您将在分支文件中找到该分支的最后一次提交SHA,或者在HEAD文件中找到该分支的最后一条记录的第二个SHA列
    3. 此命令应该是可读的并显示上次提交更改

      1. $ git show [commit SHA]
      2. 确认分支看起来没问题后,尝试检查

        1. $ git checkout [分店名称]
        2. 然后你可以重置分支

          1. $ git reset --hard
          2. 此时您拥有分支的最新提交版本。下一步是恢复存储文件。

            1. 在.git \ refs \ stash或.git \ logs \ stash文件中找到要恢复的存储
            2. 在文本编辑器中打开,您将在存储文件中找到该存储的最后一次提交SHA,或者在存储文件中找到该分支的最后一个存储记录的第二个SHA列
            3. 列出要存储的文件以供您恢复,从这里您可以获取用于恢复文件的存储位置和文件

              1. $ git show --name-only [stash SHA]
              2. 恢复藏匿文件

                1. $ git show [stash SHA]:[文件的完整路径]> [文件的完整路径]
                2. 对所有藏匿文件完成上述命令后,您已完成获取分支和存储文件。如果配置文件没有损坏,您甚至可以复制“origin”定义并推送您的更改。

                  祝你好运

答案 1 :(得分:1)

今天早上我的一个本地存储库遇到了同样的问题。在我使用Git的这些年里,我从未见过这个。我一直在使用这个特殊的仓库4个月,但现在它告诉我,当所有目录和文件(包括.git)都存在时,它不是git存储库。我有一些问题,我的机器(Windows 7)在晚上关闭,没有明显的原因可能导致一些腐败,因为我倾向于让Intellij一直打开。我的git版本是1.9.4。我尝试了“git init”重新初始化本地存储库,但它没有帮助。我将Git更新到版本1.9.5,没有帮助。本地仓库仍然有我的本地设置(git config --local -l)。幸运的是,我经常提交和推动我的分支,所以恢复就像重新克隆一样简单,但它仍然让我感到很伤心。我将现有的本地仓库重命名为其他东西,然后重新克隆了远程存储库,现在所有新的克隆版本都很好(旧的克隆版仍旧死了)。

答案 2 :(得分:0)

我在开机时从一个分支签到另一个分支时由于电源故障而关闭了计算机,我发现我的存储库已损坏。 我将存储库克隆到新文件夹“ new clone”中 来自“罗伊·B”的回答  我用包含分支和其他信息的“腐败的git文件夹”替换了“新克隆”文件夹

  • ../ corruptWorkspace / .git / objects
  • ../ corruptWorkspace / .. git / refs 还有
  • .. \ corruptWorkspace.git \ logs

存储库已恢复