如何恢复我的 Git 存储库的“缺失树”错误?

问题描述 投票:0回答:14

我们使用 Gerrit 作为我们的 Git 存储库。在一个已经活跃了几个月的项目上,我们突然无法推动任何更改。当我们执行

git push
时,我们会看到以下错误:

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

执行

git fsck --full
会产生:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a  
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27  
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff  
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2  
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f  
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df  
dangling tree 5377d7f7111d340854c3ee0946667c202227e603  
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1  
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819  
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94  
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d  

我们所有的开发人员在尝试推送时都遇到了同样的错误。到目前为止,我们已经尝试重新初始化 gerrit 存储库(git init --bare ...)并推送它。我们还尝试使用单独的存储库创建一个新的 gerrit 项目。最后,我们不断遇到同样的错误。

有人知道原因是什么,或者如何恢复吗?

git gerrit
14个回答
51
投票

使用

git push --no-thin
而不是
git push

来自 Git 文档:

当发送方和接收方共享许多相同的对象时,精简传输会显着减少发送的数据量。默认为--thin。


21
投票

导致此错误的步骤;

在头上创建一个新分支。
  • 对新分支进行一些修改
  • 有人也对头分支进行修改
  • 尝试推动你的分支
  • 如果创建了本地分支并且在头分支中进行了一些修改之后才推送,则会出现此错误。这是正常的事情,因为远程头分支在推送操作之前不知道有关本地分支的任何信息。

要解决此错误,请将头分支切换为完全拉动操作。然后切换你的分支并尝试推送。


13
投票


9
投票

现在,这听起来很不幸。令人遗憾的是,听起来您没有定期备份可供使用。不过,有个好消息:我敢打赌您的开发人员有这个文件,尽管它可能位于包文件中。在其他人的 .git 目录中尝试以下操作。

请注意,git 使用哈希的前两个字符作为目录名称。

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9

如果出现这种情况,请将该文件复制到服务器上的相同相对路径,然后生活应该会顺利进行。如果没有,那就试试这个:

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

这不会显示它是哪个包文件(您可以快速编写脚本或手动执行),但它会告诉您它在那里。找到正确的包文件并将其展开...

git unpack-objects $FILE

从那里,将文件复制到服务器上的相同相对路径。如果这不能解决问题,则需要进一步的工作。更换开发人员的足够最新的存储库可能会解决问题。您可能还想探索 
https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F

,或发布更新评论并等待我回来解决此问题。


7
投票

git gc --aggressive --prune=now

首先备份你的 git 仓库!


4
投票
git pull --rebase


我保存了差异(

git show > ~/mychanges.txt

,取出文件顶部的提交消息)。签出一个新分支 (

git checkout -b newbranch
) 应用更改 (
git apply ~/mychanges.txt
),然后执行
git pull --rebase
。然后一切就都成功了。
    


3
投票

git push --delete origin <branch_name>

然后将你的分支推回到远程:

git push -u origin <branch_name>



2
投票

git gc

然后做

git 推送

遇到同样的问题。上述解决方案对我有用。


1
投票
upstream

和本地分支 foo 首先使用

丢弃所有未提交的更改

git reset --hard foo

然后使用
跟踪远程分支

git branch --set-upstream-to=upstream/foo

最后

git pull



1
投票
--no-thin

的论点对我不起作用。有效的是

git pull
(所以可能是
git fetch
    


0
投票


0
投票


0
投票


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.