【问题标题】:Where is git blob containing filegit blob 包含文件在哪里
【发布时间】:2018-03-23 18:56:41
【问题描述】:

我试图找出 git 将包含文件的 blob 存储在哪里。为此,我首先对我的 repo 进行最后一次提交的 git cat-file -p 。这告诉我树的位置,所以我对该哈希执行 ls-tree 并查看该最新提交中的所有文件 [和子树]。 ls-tree 命令输出的每一行都显示了权限、类型(blob 或树)、散列和文件(或目录,如果它是树)名称。

我的问题是在我的 .git/objects 目录中找不到此清单中显示的哈希值。我可以在 ls-tree 命令中对哈希执行 git cat-file -p ,它可以正确显示文件,但我找不到存储该文件的 blob。

我认为这里可能发生的情况是 ls-tree 中显示的哈希不是文件的哈希,而是文件哈希的哈希加上树对象中的其他信息 [如文件姓名]。如果是这种情况,我希望能够查看该树对象的“皮下”,以找到存储文件的 blob 的真正哈希。

这有可能吗??

我已经尝试过下面的第一个建议,但哈希值根本不存在。我不想尝试第二个,因为我不确定它是否会将材料重写到我的仓库中。

【问题讨论】:

  • 如果哈希是XYZ111...然后进入.git\objects,找到XY目录(哈希的前2个字符),然后在里面找到其余的,在这种情况下Z111.... .看看有没有帮助。
  • 它们要么在.git/objects 下作为松散对象,要么在.git/objects/pack 作为打包对象。

标签: git hash


【解决方案1】:

这里的基本问题是 Git 没有承诺 blob 对象的存储位置和方式.git/objects/ab/cdef... 文件是 initial 位置,是所有当前版本的 Git 存储 Git 所称的 loose 对象的位置,但松散的对象最终会打包 em>,进一步压缩它们。

打包对象作为增量链存在于.pack 文件中。在普通包文件中,构成完整对象的所有“部分”都在同一个包文件中。 “瘦”包可以针对同一个包文件中不存在的对象进行增量压缩。有关更多详细信息,请参阅the technical documentation

通常,您根本不需要处理对象和打包文件。只需使用git cat-file -p <hash-id> 即可从给定的哈希 ID 中获取数据。

如果出于某种奇怪的原因,您想从包文件中取出一个松散的对象,您可以使用git unpack-objects 将包文件分解为各个组件。请注意,这不能用于存储库中存在的包文件,也不能用于瘦包。如果你有一个流浪的瘦包,你必须先用git index-pack --fix-thin修复它。

【讨论】:

  • 正如 Scott Chacon 在 Pro-Git 第 14 章中所说:“(在您推送到远程存储库或执行 git gc 之后)保留的(唯一)对象是不存在的 blob任何提交所指向的。”我要补充一点,我看过的几个视频教程中没有一个提到包文件,而且 Pro-Git 本身在第 10.2 章中似乎暗示 blob 仍然“松散”。我不应该这么说,但非常感谢你,torek。
  • 松散->打包转换的实际时机很棘手:它由git pack-objectsgit repack 运行,但它们通常由git gc 运行,您几乎无法控制何时自动 gc运行。一旦打包,松散的对象通常会被git prune-packed 移除(这也是git gc 的一部分)。接收 Git 过去常常在接收后立即运行 gc,以丢弃被拒绝的对象,但在 2.11 左右的某个地方,Git 为传入的对象建立了一个临时的“隔离”位置,一旦它们被接受就会迁移。这一切都相当多变:-)
猜你喜欢
  • 2011-05-19
  • 2010-10-30
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2010-12-13
  • 2021-03-27
  • 2014-01-06
相关资源
最近更新 更多