git裸存储库中缺少树对象(链接断开)

时间:2018-10-09 18:11:19

标签: git

我在外部驱动器上保留了一个裸露的git存储库(称为 mylibs ),在该驱动器中我有一个 dev 分支。我最近做了:

git clone /media/extdrive/mylibs; cd mylibs
git checkout dev

很惊讶收到:

  

致命:无法读取树03e99624424e6bd337ee16122567338751abef05

在裸仓库中运行git fsck,报告:

Checking object directories: 100% (256/256), done.
broken link from    tree 892d4fd7eb30964eb33de9ac707b4b0edbc919a5
              to    tree 03e99624424e6bd337ee16122567338751abef05
              missing tree 03e99624424e6bd337ee16122567338751abef05
              dangling blob e94d7824aca487641c11ff8312915fae5ef62cbe
              dangling blob 27afaaaa0f9979b4963d86bb1e5ddc3fe0d50d8b
              dangling blob e3d72157044f5b6808881025102764726f672d61

我知道这个话题已经讨论到死了(例如:123),但是我发现的答案似乎都相当复杂,有些过头了我的头。更重要的是,似乎没有一个有效(肯定是因为我做错了,不是因为答案不正确)。

我已经在各处克隆了此存储库,虽然我没有 bare 存储库的备份,但是工作克隆都是最新的,并且可以拥有03/e99624424e6bd337ee16122567338751abef05对象。

我的问题是:我可以直接将03/e99624424e6bd337ee16122567338751abef05对象从有效克隆中直接复制到 存储库的.git/objects目录中吗?我的外部驱动器,还是一个不完整的过程?

即这够吗?

# assuming I'm in a working copy
cp .git/objects/03/e99624424e6bd337ee16122567338751abef05 \
   /media/extdrive/mylibs/.git/objects/03/.

路径/media/extdrive/mylibs/.git/objects/03/已经存在,并且包含其他一些对象。

注释:

  1. 我制作了一个裸仓库的副本,并测试了上面的内容,它似乎工作正常。但我想确保我不会错过任何东西。
  2. .git / objects / pack /目录在裸存储库和我所有工作的克隆中都是空的。我不知道这是否表示什么,但是它排除了我发现的某些解决方案的使用。

1 个答案:

答案 0 :(得分:1)

这应该行得通,尽管将树放在适当的位置可能会表明您有更多丢失的对象(您可以继续复制它们)。一棵树不包含任何特定于存储库的位置或配置的东西,它只是目录名称,哈希值和模式的列表。但是,您应该检查两个存储库的git config core.compression值是否相同;否则,复制的文件将以与存储库不同的级别进行压缩(不确定git是否可以处理该文件)。

如果该方法不起作用,则可以尝试使用update-indexwrite-treemanually recreate the tree。请注意,您可以使用update-index而不用使文件处于正确的状态:您可以将模式,sha和文件名都提供给--cacheinfo