In some previous backups, your bad objects may have been packed in different files or may be loose objects yet. So your objects may be recovered.
It seems there are a few bad objects in your database. So you could do it the manual way.
Because of git hash-object
, git mktree
and git commit-tree
do not write the objects because they are found in the pack, then start doing this:
mv .git/objects/pack/* <somewhere>
for i in <somewhere>/*.pack; do
git unpack-objects -r < $i
done
rm <somewhere>/*
(Your packs are moved out from the repository, and unpacked again in it; only the good objects are now in the database)
You can do:
git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee
and check the type of the object.
If the type is blob: retrieve the contents of the file from previous backups (with git show
or git cat-file
or git unpack-file
; then you may git hash-object -w
to rewrite the object in your current repository.
If the type is tree: you could use git ls-tree
to recover the tree from previous backups; then git mktree
to write it again in your current repository.
If the type is commit: the same with git show
, git cat-file
and git commit-tree
.
Of course, I would backup your original working copy before starting this process.
Also, take a look at How to Recover Corrupted Blob Object.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…