可以指示git fetch pack提取单个树对象吗?

时间:2019-08-16 19:36:09

标签: git go-git

简而言之,我是否有办法从仅支持智能协议但不支持过滤器规范的git服务器中有效地(在空间上)指定我想要的确切对象?

更多上下文: 由于GitHub在pack协议中缺乏对过滤器规范的支持,我一直在尝试构建一种方法来获取一个数GB的存储库,该存储中的一次提交也包含数GB。我的想法是使用仅指定单个提交对象的want的提取包请求(或服务器上的上传包),然后从那里获取该对象,获取其引用的树,在另一个请求中获取该树对象,然后手动指定我要从那里开始的Blob和树对象。不过我发现,从为您“想要”的特定提交或树提供尽可能多的数据的角度来看,pack协议似乎可以正常工作。

这对于我正在执行的操作的意义是,无论何时指定树哈希的提交,我不仅会得到提交或树对象,而且还会得到它们包含的每个对象。在使用加深设置来限制我想要的提交次数时,也会发生这种情况。 0不产生任何结果,1产生上述结果。我已经验证过,仅将blob指定为want会导致带有该blob的打包文件,从而使该部分按预期工作。

2 个答案:

答案 0 :(得分:2)

除非启用了过滤器功能,否则在Git协议中无法实现您所要求的内容。

并且一直以来,Git协议旨在有效地交换一组提交。 Git在服务器端实现用于获取的协议的方式是,它将客户端的have提交标记为不感兴趣,然后将修订版本从所请求的内容移至不感兴趣的点,包括这些点之间可到达的所有必要对象。这种方法必须要求您要行走的点是提交的。

可以发送对树对象的请求,但是服务器端不会执行您期望的操作。您最终将获得该树以及该树中可访问的所有内容(所有blob和其他树),这将大大超出您的需求。同样,如果您考虑一下Git协议的工作原理,这将是非常合理的:用户已要求从此刻起可以访问所有对象。

您可以指定have某些树对象以排除它们,但是当然这要求您知道它们是什么,在这种情况下您不需要。即使这样,您仍然会收到该层次结构中存在的Blob。

过滤器功能仅调整包中包含的对象,因此您可以通过排除深度以下的所有内容来指定仅包含一个树对象。这些参数将传递给git rev-list --objects,以便打包生成将排除您不感兴趣的东西。否则,默认值为包括您请求范围内的每个可到达对象。

答案 1 :(得分:0)

您在问如何将远程存储库视为本地对象db。做到这一点的方法是通过访问安装了该对象db的系统或通过本地安装包含该对象的文件系统,来访问远程存储库的对象db的文件系统。

  

任何时候我指定一个树哈希的提交,我不仅会得到提交或树对象,还会得到它们包含的每个对象

是的,否则最终会导致存储库损坏。如果您想这样做,可以如上所述进行,绕过Git的一致性检查,然后自己在已安装的对象db上运行pack-object,该对象在stdin上接受任意sha并编写一个与您要的对象。将输出包拖放到任何存储库的对象dir和voila中,该存储库具有这些对象。