我正在使用Git进行一些高级用法,查询对象以优化我的代码的测试运行,所以如果以下内容听起来与大多数人使用Git的用法相差甚远,请耐心等待。
我想做git cat-file -p [...]
之类的事情,除了遥控器上的物体,没有抓取它们。即,我想说,“在远程origin
上,告诉我提交A
,具体告诉我它的树的id是什么;然后告诉我树的内容(blob和子树的列表。 )“我不需要获取文件的实际内容,只需要获取上述信息。
我知道我可以从远程设备获取提交到我的本地仓库并在其上使用git cat-file
,但之后它将涉及从远程提取所有提交的父项,这可能需要很长时间时间。我需要这个很快,因为它是在一个程序中完成的,该程序应该每天在许多不同的存储库上运行数百次。
有没有办法在不提取提交的情况下执行上述操作?
答案 0 :(得分:1)
我认为您已经确认git fetch --depth=...
没有做您想做的事。
如果你有ssh/scp
访问远程的权限,你可以简单地获取该提交的个人文件(如果提交为哈希a1b2c3d4
,它存储在文件objects/a1/b2c3d4
内) 。将其放在同一目录/名称下的本地.git/objects
中。然后像往常一样使用本地git cat-file
。从输出中,您可以解析树的哈希值,然后从那里继续,获取单个目标文件直到完成。 git cat-file
并不关心任何丢失的位,如果你有一个文件存在的哈希值,它会愉快地输出它的内容。
为避免“真正的”本地存储库出现问题,您可以在空存储库中执行此操作,即使用git init tmprepos
创建的存储库或其他存储库。那里没有别的东西也没什么坏处。
编辑:git将一些对象存储在pack文件中。有关如何获取这些内容的说明,请参阅https://git-scm.com/book/en/v1/Git-Internals-Transfer-Protocols。