2016-12-01 45 views
0

我想在repo历史记录中的某个点访问一些blob。Git:在.git目录中获取blob路径

目前,我用git show $REV:$PATH来做。但是文件非常大,我不希望它们被读取并通过脚本进行传送。我想获得他们的路径,然后阅读为纯文件。

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

+1

[封装存储库](https://git-scm.com/docs/git-repack)(例如,在执行'git repack -ad'之后)呢?在打包的存储库中,blob可能不作为独立文件存在。 – Leon

+1

.git/objects中的文件不是原始数据。他们被压缩,并有一个小头。通过直接访问文件你什么也得不到。 – j6t

+0

@Leon @ j6t换句话说,我想要的只是一个梦,直接访问'.git'目录仍然是个坏主意?我认为blob始终保持不变... –

回答

1

虽然BLOB数据inviolablesacrosanct,它也是一个格式不可用凡人:

  • 由于j6t said in a comment,它的zlib-瘪了(但是这是一个实现细节,而不是一个承诺,也就是说,你不应该打开并阅读它,并使用zlib充气机来恢复它,你应该让Git为你做)。

  • 由于Leon said in a comment,它可能已被包装,在这种情况下,没有解压目标文件打开并在第一时间阅读。相反,您必须打开包索引文件(以查找正确的包文件),然后打开正确的包文件(以查找包含查找对象及其基底的目录的包装数据),然后撤消xdelta样式,但是not actually 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设置来查找要进行的涂抹过滤器和/或CR-LF调整。这些过滤器应用于库内数据以生成文件的工作树副本。但是当您使用git showgit cat-file -p访问存储库数据时,没有使用过滤器

+0

感谢您的详细解答。是的,我知道使用管道命令可以做到这一点,但重点是获取文件本身...我现在明白这个想法不能实现,并会使用'git show'的输出。另外,您明确指出,git不会触及新行符号。 –