在工作中我们必须应对一个非常庞大的 git 存储库(90Go)。
在尝试调整本地副本上的一些内容后(我的包文件出现错误,尝试解压它),我可能删除了一些目标文件。
例如:
> git GC
错误:无法读取 af9ed8[:snip:]
致命:坏树对象 af9ed8[:snip:]
错误:无法运行重新打包
如何从远程存储库获取特定对象(在这种情况下是哈希值 af9ed8...)?
如果您有远程文件系统访问权限或包含此对象的任何其他完整存储库,你应该能够去那里运行:
git cat-file tree af9ed8 > 9ed8...
请注意,这仅需要对存储库的只读访问权限(您可以在其他地方写入文件),因此它应该非常安全,您甚至可以以没有文件系统写入权限的用户身份执行此操作。然后,您可以将其传输/复制到存储库中的适当位置:
cp path/to/9ed8... .git/objects/af/9ed8...
松散对象存储在具有哈希值前两位的目录中;文件名是哈希值的其余部分。
编辑:如果对象在远程端松动,您也可以直接将其复制出来.git/objects
,但如果它已打包,则必须使用git unpack-objects
,我想该存储库中的包文件太大了。最好的方法是将包文件复制到损坏的存储库中,删除任何损坏的对象,然后使用git unpack-objects < packfile
,这不会解压任何已经存在的对象。
我不知道如何通过普通的远程命令来做到这一点;即使是较低级别的git fetch-pack
仍然在引用级别运行,获取具有必要提交的包以完成引用。我怀疑您可能会做一些偷偷摸摸的事情,例如删除引用该树的所有提交对象(git fsck
可能会帮助您找到它们)。我真的希望你能够创建一个指向该对象的标签,将其推送到远程,然后尝试从远程获取标签(哄骗它获取对象),但看起来 Git 非常小心,不让您创建或操作一个指向不存在对象的标签。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)