【问题标题】:Git: get blob path in .git directoryGit:获取.git目录中的blob路径
【发布时间】:2017-04-15 22:58:40
【问题描述】:

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

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

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

【问题讨论】:

  • packed repositories 怎么样(例如,在执行git repack -ad 之后)?在打包的存储库中,blob 可能不作为独立文件存在。
  • .git/objects 中的文件不是原始数据。它们被压缩并有一个小标题。直接访问文件不会有任何收获。
  • @Leon @j6t 所以,换句话说,我想要的只是一个梦想,直接访问.git 目录仍然是个坏主意吗?我认为 blob 始终保持原样......

标签: git git-plumbing


【解决方案1】:

虽然 blob 数据 inviolablesacrosanct,但它也是普通人无法使用的格式:

    1234563应该让 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 访问存储库数据时,没有使用过滤器

【讨论】:

  • 感谢您提供如此详细的回答。是的,我知道使用管道命令可以做到这一点,但重点是获取文件本身......我现在明白这个想法无法实现,并将使用git show 的输出。另外,您明确指出 git 不会触及换行符。
  • 非常好的答案,还有关于它的存储库格式的注释 -> 当你使用 LFS 时就是这种情况,我想你会得到 LFS 指针文件......如果这是正确的......
  • @Gabriel:是的,如果你使用 Git-LFS,Git 存储的是 LFS 数据,(单独的)LFS 代码稍后用于检索文件。
猜你喜欢
  • 2015-06-06
  • 2012-07-17
  • 2015-04-07
  • 2017-02-16
  • 2018-10-19
  • 2015-09-19
  • 1970-01-01
  • 2013-02-15
  • 2012-12-13
相关资源
最近更新 更多