从pack文件中恢复git仓库

5

我正在接手一个项目,但是没有正规的git repo,而是一个pack-7dab97d983eeb36321c680bee7fde43688334f52.pack文件。我能从中恢复一个可用的git repository吗?如何操作?


1
你尝试过使用git-unpack吗?-https://git-scm.com/docs/git-unpack-objects - napster
2个回答

9

打包文件仅包含提交记录,因此您没有分支名称,您需要猜测它们。一个好的起点是悬空提交。

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

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


1
只有一个悬挂提交,所以选择“master”非常容易。非常感谢! - Dženan
1
最后一步是 git branch somebranchname SHA1_OF_dangling_commit - MR.GEWA

4

你可能会有两个问题:

  1. 我能恢复原始仓库,包括所有分支名称吗?
  2. 我能恢复某种类型的仓库,可能足够满足某些目的吗?

答案对于问题1是不行

答案对于问题2是也许可以,甚至很可能可以,只要它不是“瘦”包

max630的回答提供了一种实现答案2的方法,并解释了为什么无法实现答案1:一个仓库基本上由两个数据库组成。其中之一是名称到哈希ID的数据库。您完全缺少这个数据库:您没有名称

另一个数据库包含对象:提交和支持对象。你确实有其中一些。

具体来说,pack文件是对象的集合。一个仓库可能使用多个pack文件,并且/或者可能包含loose(未打包)的对象。因此,拥有pack文件并不能保证您拥有与该仓库相关的所有对象:您可能只拥有其中的一些对象。
然而,对于大多数pack文件,还有第二个保证:pack文件使用delta-compression来节省空间,但仅会针对同一个pack文件中包含的其他对象进行增量压缩。这意味着这个pack文件独立于可能组成完整对象数据库的任何其他pack文件:您可能拥有不完整的切片,但至少可以提取所有对象。
这条规则被thin packs所违反:thin pack被定义为某些对象丢失的pack,因此该pack通常无法使用。您可能在这样的文件中拥有一些完整的对象——它们仅引用同一文件中的其他对象,或根本没有进行增量压缩——但总的来说,thin packs将没有足够的对象可用于大多数目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接