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

Geo*_*tov 3 git git-plumbing

我想在回购历史记录中的某个时刻访问一些 blob。

目前,我使用git show $REV:$PATH. 但文件非常大,我不希望在脚本中读取和传送它们。我想获取他们的路径,然后将其作为普通文件读取。

我可以依赖当前文档中描述的布局(例如.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0),获取文件哈希并将其手动转换为路径吗?我的意思是它在未来的版本中不会很快改变,并且对象目录始终具有这种结构。有没有更简单的方法可以通过一些管道命令来做到这一点?

tor*_*rek 5

虽然 blob 数据 不可侵犯神圣不可侵犯的,但它的格式对于凡人来说也是无法使用的:

  • 正如j6t 在评论中所说,它是 zlib-deflated (但这是一个实现细节,而不是一个承诺,即,你不应该只是打开并阅读它并使用 zlib 充气器来恢复它,你应该让 Git为你做那件事)。

  • 正如Leon 在评论中所说,它可能已被打包,在这种情况下,首先没有可打开和读取的未打包目标文件。相反,您必须打开包索引文件(以查找正确的包文件),然后打开正确的包文件(以查找包含定位对象及其基础的目录的打包数据),然后撤消xdelta样式,但实际上不是 xdelta,这些项目的压缩。

如果你想使用管道命令读取文件,你可以首先找到哈希值:

$ git rev-parse HEAD~20:Makefile
bdb55792f11a9f9565c4aad147a492caed7f09c3
Run Code Online (Sandbox Code Playgroud)

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

$ git cat-file -t HEAD~20:Makefile
blob
Run Code Online (Sandbox Code Playgroud)

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