如何修复git missing blob?

时间:2014-07-11 07:54:29

标签: git blob git-branch corruption corrupt

因为我已经在不同地方之间发现了我的git repo,我现在已经陷入了一个破碎的git repo。当我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,但这对我没有任何帮助。

我的仓库中的所有文件仍然存在并安全备份,因此这不是问题。我想恢复我的回购历史。有人知道从这一点上我可以采取什么步骤吗?

欢迎所有提示!

4 个答案:

答案 0 :(得分:7)

我得到了一个&#34;失踪的斑点&#34;尝试修复"object file is empty" error后(实际上我最终从文件系统中删除了对象文件.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的sha1作为参数传递:

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

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

  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
    
  5. 执行这些步骤有助于我删除错误并修复损坏的本地存储库。解决方案可在this article中找到。

答案 1 :(得分:0)

我知道这是一个相当古老的问题,但我刚才遇到了同样的问题,其他SO答案都没有对我有用,这里也没有提供答案。

阅读你的问题,我从你的第一句话中得到了一个想法:

  

因为我已经在不同地方之间发现了我的git repo,我现在已经陷入了一个破碎的git repo。

我正在使用USB记忆棒进行同步。通过这种方式,我可以在我的任何设备上的工作目录中git pull <path/to/usb/repo> master从USB记忆棒中拔出,​​然后推送&#34;推送&#34;到USB记忆棒我将目录更改为USB记忆库并使用git pull <path/to/working/directory> master。它工作好几次直到今天。在我的一个工作目录中执行git pull <path/to/usb/repo> master时,我得到了

errror: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due emote: fatal: unable to read 8f6d079cdb5243f5a2d1000e31967f4c361b7966
remote: aborting due to possible repository corruption on the remote side.

在我的USB回购中执行git fsck时,我得到missing blob ......(对不起,我没有复制,但只有2个丢失的blob)。总而言之,我的问题与你的问题非常相似。阅读你的我有以下想法:

TL; DR:最后,我执行了scan and fix所显示的APPLICATION FAILED TO START Description: Parameter 1 of method kafkaListenerContainerFactory in org.springframework.boot.autoconfigure.kafka.KafkaAnnotationDrivenConfiguration required a bean of type 'org.springframework.kafka.core.ConsumerFactory' that could not be found. - Bean method 'kafkaConsumerFactory' in 'KafkaAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.kafka.core.ConsumerFactory; SearchStrategy: all) found bean 'kafkaConsumerFactory' Action: Consider revisiting the conditions above or defining a bean of type 'org.springframework.kafka.core.ConsumerFactory' in your configuration. 内容,实际上每次插入任何USB记忆棒时都会弹出从来没有做过我觉得有用的事 - 直到现在。它实际上解决了整个问题。

答案 2 :(得分:0)

已接受的答案或任何变体形式对我都不起作用,因为git fsck没有显示丢失的斑点,也没有

$ git ls-tree -r HEAD | grep <missing blob hash id>

退回任何东西。

对我有用的是我雇用的一个小技巧。我正在分享它,以防有人碰到它。

我将存储库克隆到一个新位置,并将其签出到我正在处理的分支中。我搁置了当前损坏的存储库中的更改(因为我做了一些我无法承受的更改),然后将其从新克隆的存储库复制到.git文件夹中到旧的存储库。然后,我运行了git pull,它就可以工作。

答案 3 :(得分:0)

接受的答案帮助我解决了问题。

但是,如果丢失的 blob 是当前目录中的文件,我建议更快地修复(这就是我的情况)。

这意味着,由于某种原因,一个文件没有被 git 正确索引,并导致 missing blob

要查找丢失的 04da887681cecfd6cd59a928008b0e52ffe2a2bf blob,您可以转到 .git 目录,然后启动:

find . -type f -print -exec git hash-object {} \; | grep -B1 04da887681cecfd6cd59a928008b0e52ffe2a2bf

这将遍历您的数据以查找未编入索引的文件。 如果它找到了一些东西,你现在就有了要索引的文件:

./myfile.php
04da887681cecfd6cd59a928008b0e52ffe2a2bf

然后,您可以将其编入索引:git hash-object -w ./myfile.php

如果没有找到该文件,这意味着它可能是该文件的先前版本,或者已丢失的文件。