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

Roy*_*y B 6 git corruption

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

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

有人可以帮助我让工作区再次进入工作状态或恢复分支或存储中的一些文件吗?

Roy*_*y B 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

从这里你可以恢复分支/提交.

  1. 通过在.git\refs\heads或.git\logs\HEAD文件中找到它来查找要恢复的分支
  2. 在文本编辑器中打开,您将在分支文件中找到该分支的最后一次提交SHA,或者在HEAD文件中找到该分支的最后一条记录的第二个SHA列

此命令应该是可读的,并显示上次提交更改

  1. $ git show [commit SHA]

在确认分支看起来正常后,尝试检查它

  1. $ git checkout [分行名称]

然后你可以重置分支

  1. $ git reset --hard

此时,您拥有分支的最新提交版本.下一步是恢复存储文件.

  1. 通过在.git\refs\stash或.git\logs\stash文件中找到它来查找要恢复的存储
  2. 在文本编辑器中打开,您将在存储文件中找到该存储的最后一次提交SHA,或者在存储文件中找到该分支的最后一个存储记录的第二个SHA列

列出要存储的文件以供您恢复,从此处可以获取用于恢复文件的存储位置和文件

  1. $ git show --name-only [stash SHA]

恢复存储的文件

  1. $ git show [stash SHA]:[文件的完整路径]> [文件的完整路径]

对所有藏匿文件完成上述命令后,您已完成获取分支和隐藏文件.如果配置文件没有损坏,您甚至可以复制"origin"定义并推送您的更改.

祝好运


小智 1

今天早上我的本地存储库之一遇到了同样的问题。在我使用 Git 的这些年里,我从未见过这种情况。我已经使用这个特定的存储库 4 个月了,但现在它告诉我,当所有目录和文件(包括 .git)都在那里时,它不是一个 git 存储库。我的机器(Windows 7)在晚上无缘无故地关闭了一些问题,这可能会导致一些损坏,因为我倾向于让 Intellij 始终保持打开状态。我的git版本是1.9.4。我尝试“git init”重新初始化本地存储库,但没有帮助。我将 Git 更新到版本 1.9.5,没有帮助。本地存储库仍然具有我的本地设置(git config --local -l)。幸运的是,我经常提交并推送我的分支,因此恢复就像重新克隆一样容易,但它仍然让我抓狂。我将现有的本地存储库重命名为其他名称,然后重新克隆远程存储库,现在新克隆的一切都很好(旧的克隆仍然死了)。