git 个对象在磁盘上的存储位置的完整列表是什么?

What is the complete list of location where git objects are stored on disk?

我有一个 git 存储库,我正在尝试查找特定提交在磁盘上的存储位置。

  1. git show <HASH> 显示提交。
  2. git cat-file -p <HASH> 以原始形式显示提交。
  3. 提交不在 .git/objects/.
  4. 提交不在 .git/lfs/objects/
  5. 里面没有命名.git/packed-refs
  6. grep -r <HASH>find -name '*<PART_HASH>*' 没有任何结果。

问题:

Git 将对象作为松散对象存储在 .git/objects 的子目录下,或者作为压缩对象存储在 .git/objects/pack 的其中一个包中。打包对象可以更有效地存储它们,因为它们可以存储为与其他对象的增量(差异)。

如果要查找包含对象的包,可以通过将 .git/objects/pack 下的 .idx 文件之一传送到 git show-index 来列出相应的索引。这将列出相应包中包含的对象。

例如,在我的本地副本 git/git:

$ git show-index < .git/objects/pack/pack-0ebde31e89dd275864d40ae21ad3228a9dc7d0ea.idx | \
  head -n5
116264 0049c569260e2acbe490aabd267b233e9db28e8d (f0b1bf76)
182726 005e07db39e571eb3e73fbf7e4dbe5c67ad73e1e (29e2a47f)
99906 00c6aa0351c8d3abbcbee96d50cd7a359dd68a33 (e7952421)
477311 01724db3b51dc57d9e53e753148b5fbf548aa094 (0f597941)
186631 01b76e6be63bd19e446b3ede742bff887b7e81d5 (fd3f4a72)

中间部分是对象 ID,这可能就是您要查找的内容。

请注意 packed-refs 仅包含打包的引用;如果该对象不是任何 ref 的头部,则它不会出现在那里(或任何松散的 ref 文件中)。另请注意,核心 Git 不会在 .git/lfs/objects 下存储任何内容,并且 Git LFS 存储在那里的对象是完全独立于 Git 对象的对象,即使存储库正在对对象使用 SHA-256。