Git:从远程获取特定对象

在工作中,我们必须应对一个非常庞大的git仓库(90Go)。 在尝试调整本地副本上的某些内容(我对包文件有错误,试图解压它)后,我可能删除了一些目标文件。 例如:

> git gc

错误:无法读取af9ed8 [:snip:]

致命:坏树对象af9ed8 [:snip:]

错误:无法运行重新包装

我如何从远程存储库获取特定的对象(在这种情况下,哈希af9ed8的对象)?


如果你有远程文件系统访问权限或任何其他包含这个对象的完整版本库 ,你应该可以去那里运行:

git cat-file tree af9ed8 > 9ed8...

请注意,这只需要对repo进行只读访问(您可以在其他地方写入文件),因此它应该非常安全,您甚至可以将其作为对文件系统没有写权限的用户来执行。 然后,您可以将其复制/复制到回购中的适当位置:

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

链接地址: http://www.djcxy.com/p/57319.html

上一篇: Git: fetch a specific object from a remote

下一篇: Is it possible to make conditional inserts with Azure Table Storage