2012-01-31 83 views
7

在工作中,我们必须应对非常大的git存储库(90Go)。 在尝试调整我的本地副本上的某些内容后(我对包文件有错误,试图将其解包)后,我可能删除了一些目标文件。 例如:Git:从远程获取特定对象

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

我怎样才能获取从远程仓库的特定对象(在这种情况下,一个与哈希af9ed8 ......)?

+1

我知道这并不回答你的问题,但你可能会考虑建议分解回购!如果现在这么大,它只会变得更大,而哇,这需要很长时间来克隆。 – Cascabel 2012-01-31 17:16:08

+0

如果你运行'git fetch origin',会发生什么?它是否尝试获取太多的对象? – Cascabel 2012-01-31 17:22:43

+0

@Jefromi这基本上是不可克隆的^^。该程序只是抄袭原始回购。我很乐意让它分散开来,但那会是一件糟糕的事情,整个队伍瘫痪,这不是主管们要做的。我对此不负责任(我有点新......)。他们只是用来应付它:叹息:... – 2012-01-31 17:32:08

回答

4

如果你有远程或任何其他完整包含此对象库文件系统访问,你应该能够去那里,并运行:

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非常小心,不要让您制作或操作指向不存在对象的标签。

+0

它告诉我,当我试图再次修剪我的本地回购的对象af9ed8 ...已损坏。 – 2012-02-01 09:07:24

+0

修剪?你的意思是'git gc'?也许你应该从'git fsck'开始。并且它表示在从另一个回购中复制完整的对象后,该对象已损坏? (我不确定我是否想要在这个大的回购库上运行'git gc',这将需要一段漫长的时间。) – Cascabel 2012-02-01 18:17:53

+0

那么git gc给了我相同的答案。我想我放弃了...... – 2012-02-01 22:23:59