我们正在使用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 repo(git init --bare ...)并推进它。我们还尝试使用单独的回购创建一个新的gerrit项目。最后,我们不断得到同样的错误。
有没有人知道原因是什么,或者如何恢复?
答案 0 :(得分:39)
使用git push --no-thin
代替git push
。
来自Git docs:
当发送方和接收方共享许多相同的共同对象时,精简传输会显着减少发送的数据量。默认值为--thin。
答案 1 :(得分:14)
我在tortiuse git上遇到同样的错误。我终于找到了这个错误的根本原因。
导致此错误的步骤;
如果创建了本地分支,并且在head分支中进行某些修改之后不会推送,则会发生此错误。这是正常的事情,因为远程头部分支在推送操作之前对您的本地分支一无所知。
要解决此错误,请切换头部分支获取完整的拉动作。然后切换你的分支并尝试推送。
答案 2 :(得分:8)
支持它......在你尝试任何事情之前,将它备份到这一秒。
现在,这听起来很不幸。同样令人遗憾的是,听起来你没有定期备份。但是有一些好消息:我打赌你的开发人员有这个文件,虽然它可能在一个包文件中。在其他人的.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,或发布更新评论并等待我重新回到此处。
答案 3 :(得分:7)
当我们得到这个时,我几乎总能用git gc修复它:
git gc --aggressive --prune=now
首先备份你的git repo!
答案 4 :(得分:4)
尝试git pull --rebase
。
我保存了diff(git show > ~/mychanges.txt
,取出了文件顶部的提交消息)。签出新分支(git checkout -b newbranch
)应用了更改(git apply ~/mychanges.txt
),然后执行了git pull --rebase
。一切都运转了。
答案 5 :(得分:3)
如果不在主分支上,您只需删除远程分支:
git push --delete origin <branch_name>
然后将你的分支推回遥控器:
git push -u origin <branch_name>
答案 6 :(得分:2)
我有同样的问题。为了解决这个问题,我使用了git fetch,然后再次推送,效果很好。
答案 7 :(得分:1)
尝试升级你的git版本,我们看到了1.9.0的问题
答案 8 :(得分:1)
这通常发生在提交和推送的时间不同并且最终导致两个树之间不匹配的情况下。给定远程分支上游和本地分支 foo
首先使用
丢弃所有未提交的更改git reset --hard foo
然后使用
跟踪远程分支git branch --set-upstream-to=upstream/foo
最后
git pull
答案 9 :(得分:0)
从技术上讲,这个答案有点晚了,但对我来说有用的是为我试图推送的变更集创建一个补丁,将存储库重新克隆到另一个磁盘位置,应用补丁,重新启动和推送。
答案 10 :(得分:0)
快速解决方案是 获取 - &gt; Rebase-&GT; 提交然后推送。
答案 11 :(得分:0)
我删除了我的master分支并再次创建。它的工作。 git branch -D主, git checkout主 幸运的是它可以正常工作
答案 12 :(得分:0)
在我的情况下,我发现我在git rebase -i origin / master之前忘记了git fetch。因此,当我尝试使用Gerrit时,出现了上述错误。
答案 13 :(得分:0)
很奇怪,--no-thin
参数对我不起作用。起作用的是git pull
(很可能是git fetch
。
答案 14 :(得分:0)
尝试先做
git gc
然后做
git push
有同样的问题。上面的解决方案对我有用。