似乎我的远程git服务器上的某些文件已损坏,当我尝试将存储库克隆到新系统时出现以下错误。
remote: error: Could not read c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
remote: fatal: Failed to traverse parents of commit 02d8c9217333d89afd61da1788fa82329b692610
remote: aborting due to possible repository corruption on the remote side.
fatal: protocol error: bad pack header
当我运行git fsck --name-objects
时:
broken link from commit 02d8c9217333d89afd61da1788fa82329b692610 (~17)
to commit c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03 (~18)
我有一个没有错误的仓库的本地副本,有没有办法只复制丢失或损坏的文件?
答案 0 :(得分:0)
丢失或损坏的不是个文件,而是内部对象(在服务器上提交02d8c9217333d89afd61da1788fa82329b692610
)引用了另一个内部对象(c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
)不见了。有些对象存储在单个文件中,而另一些对象则打包:单个文件中有成千上万个对象。
如果有对象c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
,则可以从自己的存储库中提取对象,将其发送过来,然后插入到其他存储库中。但是,这通常比仅重新克隆 good 存储库要困难得多(前提是该存储库具有所有功能-并非每个克隆都将是完整的,例如,它可能已过时,或者可能是--single-branch
克隆)。
要提取一个对象,请先找到其类型:
git cat-file -t c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
然后提取其原始数据:
git cat-file -p c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03 > /tmp/obj.data
复制对象数据并将其插入存储库中:
scp /tmp/obj.data serverhost:/tmp/obj.data
ssh serverhost
cd ...
git hash-object -w -t $type /tmp/obj.data
其中$type
是计算机上git cat-file -t
的类型,具有正确的存储库副本。
(添加丢失的对象可能会修复所有问题,或者可能会暴露出更多问题,这是通常最好将不良存储库完全替换为另一个克隆的另一个原因。)
答案 1 :(得分:0)
由于我在本地PC上拥有最新的存储库,所以最终使用--bare参数克隆了存储库,并使用这些文件更新了服务器。
git clone --bare <path to clone from> <path to clone to>