fixgit";“未找到对象”;永远

fixgit";“未找到对象”;永远,git,git-pull,git-fetch,Git,Git Pull,Git Fetch,从一次拉取到下一次拉取,服务器上的每一次git拉取都以以下方式结束: $ git pull remote: Counting objects: 53, done. remote: Compressing objects: 100% (32/32), done. remote: Total 32 (delta 19), reused 0 (delta 0) Unpacking objects: 100% (32/32), done. error: unable to find 71682baccf

从一次拉取到下一次拉取,服务器上的每一次
git拉取
都以以下方式结束:

$ git pull
remote: Counting objects: 53, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 32 (delta 19), reused 0 (delta 0)
Unpacking objects: 100% (32/32), done.
error: unable to find 71682baccff823caa21420b16dd231c6b9c1b133
fatal: object 71682baccff823caa21420b16dd231c6b9c1b133 not found
与git fetch相同。我可以通过将文件
.git/object/71/682baccff823caa21420b16dd231c6b9c1b133
复制到服务器来解决这个问题,但是在多次拉取之后,错误仍然存在,每次都是分支上最新的提交对象

这怎么会发生?我怎样才能把它修好呢

完整的
git克隆
不是一个好的解决方案,因为此存储库位于正在运行的服务器项目上,并且在没有git控制的情况下有更多的文件


是否可以将
克隆到新目录中,然后将
.git
目录复制到旧文件夹中?或者有没有其他不涉及目录的解决方案?

我可以通过

  • 尝试获取(错误)
  • 像上面一样复制对象文件
  • git合并
    ,提交丢失的对象文件

  • 现在它似乎已经解决了,错误不再出现。

    我正在运行一个开发团队,有一个损坏的git存储库,因为我们还没有时间修复它。我发现有很多东西可以让球移动,这可能会有所帮助

    首先有一台[gc]auto=0的机器,并将整个repo解包到对象

    其次,Git1.8似乎比1.7更好地处理问题,因此,让一台使用Git1.8的机器能够访问包含源代码的文件系统

    第三,总是从1.8机器获取git,然后从1.7机器获取git

    第四,即使是1.8也无法git pull时,您需要运行git fsck | grep missing并手动将未打包的回购中的对象复制到损坏的回购上的对象存储中(其中缺失的0c0ef24…将位于objects/0c/0ef24…)

    对于我来说,这是一个谜,为什么git fetch/pull没有意识到这些是本地git中丢失的,并从源代码中获取它们,但是手动执行fetch似乎让git再次感到高兴。手动修复git repo后,运行git gc(但不要在未打包的机器上运行,否则需要找到丢失的对象,然后才能再次手动修复,这很烦人)

    真正方便的是一个命令,告诉git从源代码获取一个特定的对象,但我想如果它这样做而不需要被询问会更好:-)


    希望有帮助

    我今天在尝试使用git 1.7.1从centos 6机器上进行git拉取时遇到了这个问题。在我将git客户端从rpmforge extras升级到1.7.11之后,问题就解决了。

    您能否在另一个目录中执行
    git克隆
    ,并比较这两个repo中
    .git
    目录的内容?这可能会向您显示缺少哪些对象。@Tuxdude问题是,此消息出现在新对象上—这些对象应该在我每次执行git pull时自动提取。此外,在新克隆的repo中,所有对象都会被压缩,因此无法真正进行比较。您可以运行
    git fsck
    来验证.git目录中所有对象以及任何缺失对象的有效性
    git gc
    也可能有助于删除不需要的对象。还请签出此链接以获取一些有用的指针。不要替换
    .git
    目录(或其部分内容)!它包含了整个历史(以及更多),如果你不知道自己在做什么,在那里乱搞会毁掉这个项目。我只会在那里翻找完整存储库的副本。