如果你有远程或任何其他完整包含此对象库文件系统访问,你应该能够去那里,并运行:
git cat-file tree af9ed8 > 9ed8...
请注意,这仅需要只读访问回购(你可以在其他地方写文件),所以它应该是非常安全的,你甚至可以作为一个没有文件系统写入权限的用户来完成。然后,您可以传输/复制到适当的位置在您的回购:
cp path/to/9ed8... .git/objects/af/9ed8...
松散对象存储在哈希的前两位目录;文件名是散列的其余部分。
编辑:如果对象是你也可以只直接复制出来的.git/objects
远端松动,但如果它的包装,你有git unpack-objects
将它解开,和我想象中的那个回购的打包文件是非常大。最好的方法是将packfile复制到损坏的repo中,删除所有损坏的对象,然后使用git unpack-objects < packfile
,这将不会打开任何已存在的对象。
我不知道如何通过正常的远程命令来做到这一点;即使是较低级别的git fetch-pack
仍然在ref级别上运行,通过提交必要的提交来完成ref。我怀疑你可能会偷偷摸摸,像删除引用该树的所有提交对象(git fsck
可能会帮助你找到它们)。我真的希望你能够创建一个指向该对象的标签,将其推送到远程,然后尝试从远程获取标签(将其哄骗获取对象),但看起来Git非常小心,不要让您制作或操作指向不存在对象的标签。
我知道这并不回答你的问题,但你可能会考虑建议分解回购!如果现在这么大,它只会变得更大,而哇,这需要很长时间来克隆。 – Cascabel 2012-01-31 17:16:08
如果你运行'git fetch origin',会发生什么?它是否尝试获取太多的对象? – Cascabel 2012-01-31 17:22:43
@Jefromi这基本上是不可克隆的^^。该程序只是抄袭原始回购。我很乐意让它分散开来,但那会是一件糟糕的事情,整个队伍瘫痪,这不是主管们要做的。我对此不负责任(我有点新......)。他们只是用来应付它:叹息:... – 2012-01-31 17:32:08