出于某种原因,该对象在您的原始远程中已损坏。
您需要此存储库的另一个克隆,您可以在其中运行
git cat-file -t 2a0836034919f0cfe0f8f1ab98037884dd1c93de
没有错误,并且您想将该对象的一个好的版本注入到源的对象数据库中。
描述修复可能很棘手,因为我们正在讨论可能驻留在不同主机上并且可能由不同用户拥有的多个克隆。以下步骤假定您作为拥有源存储库的用户具有对源主机的 shell 访问权限。下面的提示origin$
指示要在托管您的源的计算机上运行的命令。
原点上的坏对象是松散格式,因此还原的最后一步是简单的复制。
假设好克隆中的对象也是松散的,然后运行
origin$ cp /path/to/good-repo/.git/objects/\
2a/0836034919f0cfe0f8f1ab98037884dd1c93de \
/path/to/origin/objects/2a
如果您的来源是裸存储库或
origin$ cp /path/to/good-repo/.git/objects/\
2a/0836034919f0cfe0f8f1ab98037884dd1c93de \
/path/to/origin/.git/objects/2a
除此以外。
如果在好的克隆中这个对象被存储在一个包中,那么你必须把它拿出来。我建议在一次性克隆中执行此操作。
origin$ git clone file:///path/to/good-repo /tmp/restore-repo
如果good-repo
在另一台机器上,则克隆 URL 将不同。
origin$ git clone user@other-machine:src/foo/.git /tmp/restore-repo
切换到保存临时存储库的目录。
origin$ cd /tmp/restore-repo
将打包文件移出对象数据库,因为如果 git 认为它已经拥有这些对象,它不会解压缩这些对象。
origin$ mkdir /tmp/restore-packs
origin$ mv .git/objects/pack/* /tmp/restore-packs
现在您可以打开包装了。
origin$ for pack in /tmp/restore-packs/*.pack; do
git unpack-objects -r < $pack
done
该-r
选项告诉git-unpack-objects
即使遇到坏对象也要继续解包。
此时,/tmp/restore-repo
现在应该包含 2a08360... 作为松散对象,所以运行
origin$ cp /tmp/restore-repo/.git/objects\
2a/0836034919f0cfe0f8f1ab98037884dd1c93de \
/path/to/origin/objects/2a
或者
origin$ cp /tmp/restore-repo/.git/objects\
2a/0836034919f0cfe0f8f1ab98037884dd1c93de \
/path/to/origin/.git/objects/2a
取决于 origin 是否是一个裸存储库。