Git:获取.git目录中blob路径

3

我希望能够在代码库的某个历史点上访问一些blob。

目前,我使用 git show $REV:$PATH 实现此操作。但是文件很大,我不想在脚本中读取并传输它们。我想要获取它们的路径,然后作为普通文件读取。

我可以依赖当前文档中描述的布局(例如.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0),获取文件哈希值并手动转换为路径吗?我的意思是,在未来的版本中它不会轻易改变,并且对象目录始终具有这种结构。 是否有更简单的方法使用一些基础命令完成这项工作?


1
打包的存储库怎么样(例如,在执行git repack -ad之后)?在打包的存储库中,blob可能不存在作为独立文件的形式。 - Leon
1
.git/objects目录下的文件并非原始数据,它们是经过压缩并带有小头部的。直接访问这些文件并不能获得任何好处。 - j6t
@Leon @j6t 那么换句话说,我的想法只是一个梦想,直接访问 .git 目录仍然不是一个好主意?我认为 blob 始终保持不变... - George Sovetov
1个回答

5

虽然 blob 数据是不可侵犯和神圣的(链接1), 但对于普通人来说,它也是一种无法使用的格式(链接2)

  • j6t在评论中所说,它是经过zlib压缩的(但这是一个实现细节,不是一个承诺,即你不能只是打开并读取它,然后使用zlib解压器来恢复它,你应该让Git为你完成这个过程)。

  • Leon在评论中所说,它可能已被“打包”,在这种情况下,首先没有未打包的对象文件可供打开和阅读。相反,您需要打开打包索引文件(以找到正确的打包文件),然后打开正确的打包文件(以找到定位对象及其基础的目录中的打包数据),然后撤消那些项的xdelta风格,但实际上并非xdelta压缩。

如果您想阅读带有管道命令的文件,您可以首先找到哈希值:
$ git rev-parse HEAD~20:Makefile
bdb55792f11a9f9565c4aad147a492caed7f09c3

然后使用git cat-file -p提取原始对象,或者使用git cat-file -t获取其类型(或者--batch-check读取有关对象的信息等)。请注意,实际上您也可以直接将路径传递给git cat-file本身:

$ git cat-file -t HEAD~20:Makefile
blob

然而,请注意一个潜在的绊脚石:当使用git cat-file -p <blob-specifier>git show <blob-specifier>访问blob内容时,您将获得数据的仓库格式。也就是说,当使用git checkout检出特定提交时,Git将提取.gitattributes文件和/或使用git config设置来查找应用的smudge过滤器和/或CR-LF调整。这些过滤器被应用于仓库中的数据以生成文件的工作树副本。但是,当您使用git showgit cat-file -p访问存储库数据时,不使用任何过滤器

感谢您提供如此详细的答案。是的,我知道可以使用管道命令来实现这一点,但关键是要获取文件本身...我现在明白这个想法无法实现,并将使用git show的输出。另外,您明确指出了git不会处理换行符号,这一点很好。 - George Sovetov
非常好的答案,还有关于它是仓库格式的说明 -> 当您使用LFS时,就会出现这种情况,我认为您会得到LFS指针文件...如果是正确的话... - Gabriel
1
@Gabriel:是的,如果你正在使用Git-LFS,Git存储的是LFS数据,而这些数据是(单独的)LFS代码用于以后检索文件所需的。 - torek

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