3

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

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

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

4

1 回答 1

3

虽然 blob 数据 不可侵犯神圣不可侵犯的,但它的格式也对普通人无法使用:

  • 正如j6t在评论中所说,它是zlib-deflated(但这是一个实现细节,而不是一个承诺,即你不应该只是打开并阅读它并使用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>或访问 blob 的内容时git show <blob-specifier>,您将获得数据的存储库格式。也就是说,在签出特定提交时(使用git checkout),Git 将提取.gitattributes文件和/或使用git config设置来查找要进行的涂抹过滤器和/或 CR-LF 调整。这些过滤器应用于存储库中的数据以生成文件的工作树副本。但是当您使用git showgit cat-file -p访问存储库数据时,不使用过滤器

于 2016-12-01T17:09:03.057 回答