从包文件中恢复git repo

时间:2018-04-02 18:21:25

标签: git

我正在接管一些项目,我没有合适的git repo,而是一个 pack-7dab97d983eeb36321c680bee7fde43688334f52.pack 文件。我可以从中恢复一个有效的git存储库吗?怎么样?

2 个答案:

答案 0 :(得分:6)

包文件只包含提交,因此您没有分支名称,您必须猜测它们。一个好的起点是悬挂提交。

  • 创建一个空存储库
  • 将包复制到.git / objects / pack /
  • 可能索引包(我不确定是否需要)
  • 运行git fsck --lost-found
  • 从找到的提示中选择你可能的分支

请注意,如果pack文件只是原始存储库中的几个文件中的一个,则会失败,因为它可能依赖于您没有的对象

答案 1 :(得分:3)

您可能会问两个问题:

  1. 我可以使用其所有分支名称还原原始存储库吗?
  2. 我是否可以恢复某种类型的存储库,这可能会或可能不会出于某种目的而足够好?
  3. 问题1的答案是

    问题2的答案是也许,甚至可能是肯定的,只要它不是“瘦”包

    max630's answer提供了一种方法,您可以通过该方法实现答案2,以及无法实现的原因答案1:存储库本质上包含两个数据库。其中一个数据库是 name-to-hash-ID。您完全缺少此数据库:您没有名称

    另一个数据库由对象:提交和支持对象组成。你确实有其中的一些。

    具体来说,包文件是一组对象。存储库可以使用多个包文件,和/或可以包含松散(解包)对象。因此,拥有包文件并不能保证您拥有所有与该存储库一起使用的对象:您可能只有某些对象。

    但是,对于大多数包文件,还有第二个保证:包文件使用delta-compression来节省空间,但只会对相同的包文件中包含的其他对象进行增量压缩。这意味着这个包文件独立于可能组成完整对象数据库的任何其他包文件:您可能有一个不完整的切片,但您至少可以提取所有对象。

    包违反了此规则:瘦包(定义为)包中缺少某些对象的包,因此包通常不可用。您可能在这样的文件中有一些完整的对象 - 仅引用同一文件中的其他对象,或者根本不进行增量压缩 - 但通常瘦包没有足够的对象可用于大多数目的。