问题描述:

git status outputs the following:

# On branch master

error: corrupt loose object '1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d'

fatal: loose object 1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d (stored in .git/objects/1e/2dc6d8b6eec682f3ecc9dd879445fea5d6a34d) is corrupt

I have 12 non pushed commits. I can see them in git log.

Is there any hope to push them?

git push outputs:

error: corrupt loose object '1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d'

fatal: loose object 1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d (stored in .git/object/1e/2dc6d8b6eec682f3ecc9dd879445fea5d6a34d) is corrupt

error: failed to push some refs to '[email protected]:username/reponame.git'


Before having these corrupted files I run:

find . -type f -print0 | xargs -0 sed -i 's/\s\+$//g'

(in the git repo directory)

This affected the .git files.


Update: I tried the VonC's suggestion running the following commands:

cd ~

$ git clone [email protected]:username/reponame.git

Cloning into 'reponame'...

remote: Counting objects: 1561, done.

remote: Compressing objects: 100% (853/853), done.

remote: Total 1561 (delta 966), reused 1067 (delta 642)

Receiving objects: 100% (1561/1561), 223.80 KiB | 94.00 KiB/s, done.

Resolving deltas: 100% (966/966), done.

Checking connectivity... done

$ cd reponame/

$ $ git remote add yourLocalRemoteName /home/user/corupted/git/repository/folder

$ git pull yourLocalRemoteName

fatal: attempt to fetch/clone from a shallow repository

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

网友答案:

You could try and:

  • clone your BitBucket repo again
  • add in that new clone a remote referencing your current local clone

    git remote add corrupt/path/to/your/first/cloned/repo
    
  • git pull corrupt, and then git push

That being said, after using git fsck for confirmation, you can try and solve that corrupt object.
As usual, make a backup of that local repo first.


After discussion, it turns out that:

  • the corrupt repo is a shallow one (cloned that way automatically by a tool).
    That means you can clone it easily, even when you do a rm .git/shallow, as suggested here.

  • one way to unshallow a shallow repo is to unpack a fresh repo and copy over the .git/objects/pack folder to the corrupted repo:

    git clone [email protected]:username/reponame.git repo2
    mkdir packs
    cp repo2/.git/objects/packs/* packs
    cd repos2
    git unpack-objects < ../packs/*.pack
    cd ..
    cp -r repo2/.git/objects/* corrupt/.git/objects/
    
  • That will remove any error due to legacy unpacked object being corrupted by the sed command, but that won't fix the ones done since that clone.

For a corrupted repo, the usual commands are listed in this answer and this comment.
In the end, the OP had:

git fsck --full
error: corrupt loose object '3ddb67eb5343e75ac36656c86c4386f8dd117df4'
fatal: loose object 3ddb67eb5343e75ac36656c86c4386f8dd117df4 (stored in .git/objects/3d/db67eb5343e75ac36656c86c4386f8dd117df4) is corrupt

(no more:

error: inflate: data stream error (incorrect data check)
error: sha1 mismatch ...

which were because of legacy commit corrupted)

For solving that, one can try and follow "Documentation/howto/recover-corrupted-blob-object.txt".


That being said, if that doesn't pan out, it is easier to at least group all last commits into one:

git clone [email protected]:username/reponame.git repo2
cd repo2
git --work-tree=../corrupt add -A .
git commit -m "last changes"
git push

One can try and rebuild all 12 commits, but that isn't obvious to do, especially when multiple modifications are done within one file.

相关阅读:
Top