【问题标题】:How to match dangling blobs with file names in Git?如何将悬空的 blob 与 Git 中的文件名匹配?
【发布时间】:2012-08-31 21:47:55
【问题描述】:

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

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

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

【问题讨论】:

  • 嗯,我原本以为你输入了rm -rf。还是可以取回来的,需要找到根树对象。
  • 检查这些对象的类型 - 是所有 blob 吗?还是那里有树?无论哪种方式,您都可以使用git cat-file <blob> 来查看其中包含的内容以进行比较。还可以看看他们的日期戳,以防万一。
  • @Alex:我如何找到根树对象?是在其中一个blob中吗?
  • @Philip:确实,它们都是 blob。我可以使用git cat-file,但要与什么比较?我只有文件名列表。
  • 听起来有点像你遇到了真正的问题。我没有意识到 git add 没有创建本地树,而是等到提交,在索引中留下详细信息。不幸的是,“git rm”从索引中清除了所有这些。我想是时候将 blob 分类到 bin、ascii 和 utf8 中,以尝试减少列表大小 - 23,000 是很多垃圾。

标签: git blobs git-dangling


【解决方案1】:

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

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

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

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

  1. 立即将工作目录复制到不同的卷 (外置高清)。
  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 条的轻微变体。

祝你好运!

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多