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

git裸机存储库中缺少树对象(断开的链接),git,Git,我在外部驱动器上保留了一个裸git存储库(称之为mylibs),其中有一个开发分支。我最近做了: git clone /media/extdrive/mylibs; cd mylibs git checkout dev 并惊讶地发现: 致命:无法读取树03E99624424E6BD337EE1612256733751ABEF05 在裸存储库中运行git fsck,报告: Checking object directories: 100% (256/256), done. broken link

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

git clone /media/extdrive/mylibs; cd mylibs
git checkout dev
并惊讶地发现:

致命:无法读取树03E99624424E6BD337EE1612256733751ABEF05

在裸存储库中运行
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
我知道这个话题已经被讨论到了极点(例:,),但我发现所有的答案似乎都相当复杂,有点让我不知所措。更重要的是,没有一个能起作用(当然是因为我做错了什么,而不是因为答案不正确)

我在各地都克隆了这个repo,虽然我没有裸存储库的备份,但工作克隆都是最新的,do
03/e99624424e6bd337ee1612256733751abef05
对象

我的问题是:我可以简单地将
03/E99624424E6BD337EE1612256733751ABEF05
对象直接从工作克隆复制到外部驱动器上的裸repo的
.git/objects
目录中吗,或者这是一个不完整的过程

i、 这是否足够

# assuming I'm in a working copy
cp .git/objects/03/e99624424e6bd337ee16122567338751abef05 \
   /media/extdrive/mylibs/.git/objects/03/.
路径
/media/extdrive/mylibs/.git/objects/03/
已经存在,并且包含一些其他对象

注:

  • 我复制了一个裸存储库,并测试了上面的内容,它似乎工作得很好。但我想确定我没有错过什么
  • 裸存储库和我的所有工作克隆中的.git/objects/pack/目录为空。我不知道这是否意味着什么,但它排除了我找到的一些解决方案的使用

  • 这应该是可行的,尽管将树放在适当的位置可能会显示您丢失了更多的对象(您可以继续复制)。树不包含任何特定于repo位置或配置的内容-它只是目录内容的名称、哈希和模式的列表。但是,您应该检查这两个存储库对于
    git config core.compression
    是否具有相同的值;否则,复制的文件将以不同于repo预期的级别进行压缩(不确定git是否能够处理该问题)


    如果不起作用,您可以尝试使用
    updateindex
    write tree
    来更新索引。请注意,您可以使用
    更新索引
    ,而不必让文件处于正确的状态:您可以向
    --cacheinfo
    提供模式、sha和文件名,谢谢。它看起来确实有效,幸运的是没有发现其他丢失的物体。复制后,
    git fsck
    不会返回任何问题。我在两个repo上都检查了
    git config--get core.compression
    ,显然这两个repo上都没有设置值。所以,我认为它们是相等的。太好了!如果为空,则默认值为's
    Z_default_COMPRESSION
    ,它“要求在速度和压缩之间进行默认折衷(目前相当于级别6)”(1-9)。顺便说一句,我无法想象该对象是如何丢失的。在推送过程中,我从未遇到过任何中断,而且两个回购协议都在我的系统上配置,因此转移实际上是即时的。这种(某种)腐败的发生有点令人担忧。现在我觉得我需要定期检查我的裸存储库是否一切正常。