我在外部驱动器上保留了一个裸露的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
我知道这个话题已经讨论到死了(例如:1,2,3),但是我发现的答案似乎都相当复杂,有些过头了我的头。更重要的是,似乎没有一个有效(肯定是因为我做错了,不是因为答案不正确)。
我已经在各处克隆了此存储库,虽然我没有 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/
已经存在,并且包含其他一些对象。
注释:
答案 0 :(得分:1)
这应该行得通,尽管将树放在适当的位置可能会表明您有更多丢失的对象(您可以继续复制它们)。一棵树不包含任何特定于存储库的位置或配置的东西,它只是目录名称,哈希值和模式的列表。但是,您应该检查两个存储库的git config core.compression
值是否相同;否则,复制的文件将以与存储库不同的级别进行压缩(不确定git是否可以处理该文件)。
如果该方法不起作用,则可以尝试使用update-index
和write-tree
至manually recreate the tree。请注意,您可以使用update-index
而不用使文件处于正确的状态:您可以将模式,sha和文件名都提供给--cacheinfo
。