我还有另一个在没有初始提交的情况下执行git rm -rf
的示例。(我意识到我添加了很多无用的文件,并想添加一些过滤器。)
现在,我只剩下23000个没有树的悬挂斑点,但有完整的Git历史!
我将使用脚本在Blob名称上循环(使用git show 'blobname' > 'filename'
),但我可以将历史记录中的这些文件名与Blob相关联吗?
对于所有曾经/将要犯我所犯错误的人,故事到此结束。
首先,简要总结一下我所做的事情。
- 创建了一个空存储库
- 移动了许多文件/目录
gid add .
- 意识到我只是添加了一吨无用/不那么重要/冗余的文件
git rm -rf
,目的是在.gitignore中添加一些过滤器- 意识到我所有的文件都不见了
我尝试了各种数据恢复工具;没有运气。我能做的最好的事情就是下面的程序。
- 立即将工作目录复制到其他卷(外部HD)
git fsck --lost-found
可能与--unreachable --cache
一起
这将创建包含所有(大部分?)的文件夹.git/lost-found/other
原始文件被重新创建,但没有文件名。现在的问题是如何恢复文件名。不幸的是,我恢复的所有文件都是Blob,没有根,所以我没有关于目录树结构的信息- 尽管我有丢失文件名的完整列表(只有名称,没有大小),但我找不到任何根,所以这些信息基本上是无用的
- 通常,可以编写一个使用
file
查看文件类型(file <filename>
)的脚本,并为其附加相应的扩展名。文件名与文件名匹配的问题仍然存在
或者,可以使用暴力。例如,为了恢复pdf,我按长度对恢复的文件进行了排序,并为其附加了.pdf扩展名,然后逐一查看。实际的pdf文件显示了一些东西,而其他文件则没有 - 为了恢复基于文本的文件(txt,tex,c,h..),我使用了grep,寻找一个我记得属于特定(组)文件的字符串
- 现在,我保留了包含所有丢失的恢复文件的目录,每次我需要其中一个文件时,我都会使用子弹头4的一个小变体
祝你好运!