如何在Git中匹配悬空blob与文件名?

时间:2012-08-31 21:47:56

标签: git blobs git-dangling

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

现在我留下了23000个没有树的摇晃的斑点,但是有完整的Git历史!

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

1 个答案:

答案 0 :(得分:2)

对于所有做过/将会犯下我所犯错误的人,这就是故事的结尾。

首先,简要总结一下我的所作所为。

  1. 创建了一个空存储库
  2. 将许多文件/目录移动到它
  3. gid add .
  4. 意识到我刚刚添加了一些无用/不那么重要/冗余的文件
  5. git rm -rf的目的是在.gitignore中添加一些过滤器
  6. 意识到我的所有档案都已消失......
  7. 我尝试了各种数据恢复工具;没运气。 我能做的最好的是以下程序。

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