将损坏或删除的提交添加到远程git服务器

时间:2019-02-11 22:59:57

标签: git bitbucket-server

似乎我的远程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)

我有一个没有错误的仓库的本地副本,有没有办法只复制丢失或损坏的文件?

2 个答案:

答案 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>