git - 如何修复 Git 中丢失的 blob?

标签 git blob git-branch corruption corrupt

因为我一直在不同位置之间同步我的 Git 存储库,所以我现在被一个损坏的 Git 存储库困住了。当我执行 git log 时,我得到了正确的历史记录,但是当我执行 git status 时,我得到了

fatal: unable to read 563e4c9abcd4114e08255db989f0f53426bdeff7

所以经过一番搜索后,我尝试了 git fsck:

Checking object directories: 100% (256/256), done.
missing blob 33244941016301570dccdcdc95e543910109d0a8
dangling blob 59f44441e6437ebc4d40182eb8a10d3e07fe367b
missing blob 5dc8ab1804acb58fc658bcd6152fbb246290c8ae
dangling blob 698c775f2599fad3d09906dead4dc67743a984bd
dangling blob 922003b8433bcad6ce9778a37628d738faa26389
dangling blob c33c0528bfee55b04d99de4580da49de4413329b
dangling blob e5107c118bde0edbe5dfb994cb6a50d235c3f06b
dangling blob 437573e539572454cb868ca5a0f5074b96d777ac
missing blob 468d1856336eaa1ce8006f38ce779c0d997c8d48
dangling blob 6fc9c88708d7d5ca455e68781472bdea119997eb
dangling blob 7225d0147fa566369ba3024324b527a7adeac094
dangling blob bb8125d15579fcf37925f09cd1883b15272f9f0d
missing blob c8095f49253ac3787a6f86943160eda2c78a6a28
dangling blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
dangling blob 0bdaed084e15add987ef86fe84f435d085475995
dangling blob 36ee13c9b334da090ea6b194606df8a2852b3b3a
missing blob 563e4c9abcd4114e08255db989f0f53426bdeff7   <= the one which results in the fatal error.
dangling blob 84f2f2a9d1d051e6418a787ca90e75446f712866
dangling blob c636d85269838efecbb496eda5a8cfd8ec753d69
dangling blob cb7a8494bfc86e894c0c6e268308ddc1dd6d713c
dangling blob d166fff9e1c85ab9f0f4f620119181c5f76c2a53
dangling blob d3b6f194df857412481a318d4275faeb6689e4a0
missing blob db9a6744bc0df03cf685296695bea6324f23e0ac
dangling blob def6a6a18457989c7d18825c7c1bbfeefc8b261d
and about 20 more..

从这里我有点迷路了。我 read something about运行 git reflog expire --expire=now --all,但这对我没有任何作用。

我存储库中的所有文件仍然存在并安全备份,所以这不是问题。不过,我想取回我的存储库历史记录。从这一点我可以采取什么步骤?

最佳答案

在尝试修复 "object file is empty" error 后我得到了一个“丢失的 Blob ” (实际上我最终从文件系统中删除了目标文件 .git/objects/f7/880aa1d1a76bfff73f3d602e15b4bc829d6a07)。

为了解决这个问题,我遵循了以下步骤:

  1. 使用 Bash 脚本 found here为了检测包含此丢失的 blob 的提交。将其放在存储库的根目录中,名称为 find.sh:

    #!/bin/sh
    obj_name="$1"
    shift
    git log "$@" --pretty=format:'%T %h %s' \
    | while read tree commit subject ; do
        if git ls-tree -r $tree | grep -q "$obj_name" ; then
            echo $commit "$subject"
        fi
    done
    

    然后运行它,将丢失的 blob 的 SHA-1 散列作为参数传递:

    ./find.sh f7880aa1d1a76bfff73f3d602e15b4bc829d6a07
    
    629afc4 ESLint warning in layers' configuration file is fixed.
    

    629afc4 是提交的 SHA-1 的一部分(这是我尝试推送到远程存储库的最后一次提交)。

  2. 查找与此 blob 关联的文件:

    git ls-tree -r 629afc4 | grep f7880aa1d1a76bfff73f3d602e15b4bc829d6a07
    
    100644 blob f7880aa1d1a76bfff73f3d602e15b4bc829d6a07    src/config/layers.js
    

    在我的例子中是 src/config/layers.js

  3. 检查文件的哈希值是否与 Git 树中的哈希值匹配:

    git hash-object src/config/layers.js
    
    f7880aa1d1a76bfff73f3d602e15b4bc829d6a07
    
  4. 如果是,那么我们可以将文件内容写入 blob:

    git hash-object -w src/config/layers.js
    

执行这些步骤帮助我消​​除了错误并修复了损坏的本地存储库。解决方案可在 this article 中找到.

关于git - 如何修复 Git 中丢失的 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692722/

相关文章:

git - 在 GitFlow 中剪切发布分支的实际命令

git-filter-branch 删除字符串,但其中字符串包含 $ '\和其他字符

使用PreparedStatement 语句进行 Java Oracle Blob 与 Blob 比较失败

java - 如何使用 byte[] 输入在 Java SE 1.5.0 中创建 java.sql.Blob 对象?

git - 将批处理文件部署到引导 Windows EC2 实例时出现问题

git - 为什么 Git 只将分支存储在 refs/remotes/origin 下?

mysql - 在 2017 年将图像存储为 blob?

git - git子模块分支是否与主项目的分支一起切换?

git - git 标签适用于所有分支吗?

git - 你如何 rebase git-svn 分支并保持元数据完整?