1

我还有另一个git rm -rf没有初始提交的例子。(我意识到我添加了很多无用的文件并想添加一些过滤器。)

现在我剩下 23000 个没有树的悬空 blob,但有完整的 Git 历史!

我将使用脚本循环遍历 blob 名称(使用git show 'blobname' > 'filename'),但是我可以将这些文件名从历史记录关联到 blob 吗?

4

1 回答 1

2

对于所有曾经/将要犯我所犯错误的人,故事到此结束。

首先,简要总结一下我所做的事情。

  1. 创建了一个空存储库
  2. 将许多文件/目录移至其中
  3. gid add .
  4. 意识到我刚刚添加了大量无用/不那么重要/冗余文件
  5. git rm -rf 然后在 .gitignore 中添加一些过滤器
  6. 意识到我所有的文件都不见了......

我尝试了各种数据恢复工具;没运气。我能做的最好的就是以下程序。

  1. 立即将工作目录复制到不同的卷(外部 HD)。
  2. git fsck --lost-found 可能与--unreachable --cache
    这将创建.git/lost-found/other包含所有(大部分?)原始文件的文件夹,但没有文件名。现在的问题是如何恢复文件名。不幸的是,我恢复的所有文件都是 blob,没有根,所以我没有关于目录树结构的信息。
  3. 即使我有完整的丢失文件名列表(只有名称,没有大小),我找不到任何根目录,所以这些信息基本上没有用。
  4. 通常,可以编写一个脚本file来查看文件的类型 ( file <filename>),并为其附加相应的扩展名。将文件与文件名匹配的问题仍然存在。
    或者,可以使用蛮力。例如,为了恢复 pdf,我按长度对恢复的文件进行排序,为它们附加 .pdf 扩展名,然后逐一查看。实际的 pdf 文件显示了某些内容,而其他文件则没有。
  5. 为了恢复基于文本的文件(txt、tex、c、h..),我使用了 grep,寻找我记得属于特定(一组)文件的字符串。
  6. 现在我将所有丢失恢复的文件保存在目录中,每次我需要其中一个时,我都会使用项目符号 4 的轻微变体。

祝你好运!

于 2012-09-15T16:48:39.253 回答