如果git文件包含损坏的松散对象,是否可以推送未推送的提交?

时间:2014-01-01 12:02:12

标签: git recovery

git status输出以下内容:

# On branch master
error: corrupt loose object '1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d'
fatal: loose object 1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d (stored in .git/objects/1e/2dc6d8b6eec682f3ecc9dd879445fea5d6a34d) is corrupt

我有12个非推送提交。我可以在git log中看到它们。

有没有希望推动他们?

git push输出:

error: corrupt loose object '1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d'
fatal: loose object 1e2dc6d8b6eec682f3ecc9dd879445fea5d6a34d (stored in .git/object/1e/2dc6d8b6eec682f3ecc9dd879445fea5d6a34d) is corrupt
error: failed to push some refs to 'git@bitbucket.com:username/reponame.git'

在我运行这些损坏的文件之前:

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

(在git repo目录中)

这会影响.git个文件。


更新:我尝试了运行以下命令的VonC's suggestion

cd ~
$ git clone git@bitbucket.org: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.

1 个答案:

答案 0 :(得分:3)

您可以尝试:

  • 再次克隆您的BitBucket仓库
  • 在新克隆中添加引用当前本地克隆的远程

    git remote add corrupt/path/to/your/first/cloned/repo
    
  • git pull corrupt,然后是git push

话虽如此,在使用git fsck进行确认后,您可以尝试solve that corrupt object 像往常一样,首先备份该本地仓库。


discussion之后,结果是:

  • 腐败的回购是浅的(通过工具自动克隆) 这意味着即使您rm .git/shallow执行suggested here,也可以轻松克隆它。

  • 取消浅析回购的一种方法是unpack a fresh repo并将.git/objects/pack文件夹复制到损坏的仓库:

    git clone git@bitbucket.org: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/
    
  • 这将删除由于sed命令损坏旧版解包对象而导致的任何错误,但这不会修复自该克隆以来所做的错误。

对于损坏的仓库,常用命令列在this answerthis comment中 最后,OP有:

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

(不再:

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

这是因为遗留提交已损坏)

为了解决这个问题,可以尝试遵循“Documentation/howto/recover-corrupted-blob-object.txt”。


话虽如此,如果不成功,最好至少将所有最后提交分组为一个:

git clone git@bitbucket.org:username/reponame.git repo2
cd repo2
git --work-tree=../corrupt add -A .
git commit -m "last changes"
git push

可以尝试重建所有12次提交,但这并不明显,尤其是在一个文件中进行多次修改时。