简而言之,我是否有办法从仅支持智能协议但不支持过滤器规范的git服务器中有效地(从空间角度)指定我想要的确切对象?
更多上下文:由于GitHub在pack协议中缺乏对过滤器规范的支持,我一直在尝试构建一种方法来获取一个数GB的存储库,其中单个提交也包含数GB。我的想法是使用want
仅指定单个提交对象的a 的获取包请求(或服务器上的上传包),然后从那里获取该对象,获取其引用的树,在另一个请求中获取该树对象,然后手动指定我想要从那里的Blob和树对象。不过,我发现,从为想要“提交”的特定提交或树提供尽可能多的数据的角度来看,pack协议似乎可以正常运行。
这对于我正在执行的操作的意义是,无论何时指定树哈希的提交,我不仅会获得提交或树对象,而且还可以获得它们包含的每个对象。在使用加深设置来限制我想要的提交次数时,也会发生这种情况。0不产生任何结果,1产生上述结果。我已经验证过want
,仅指定blob确实会导致带有该blob的打包文件,从而使该部分按预期工作。
除非启用过滤功能,否则您所请求的内容在 Git 协议中是不可能的。
Git 协议始终被设计为有效地交换一组提交。Git 在服务器端实现获取协议的方式是,它将客户端的have
提交标记为不感兴趣,然后将修订从请求的内容向下移动到不感兴趣的点,包括这些点之间可到达的所有必要对象。这种方法必然要求您所走的点得到承诺。
可以发送对树对象的请求,但服务器端不会执行您期望的操作。您最终会得到该树以及包中可从该树访问的所有内容(所有斑点和其他树),这将比您想要的数据多得多。同样,如果您考虑一下 Git 协议的工作原理,这是完全有道理的:用户已请求从此时可访问的所有对象。
您可以指定have
某些树对象以排除它们,但这当然要求您知道它们是什么,但在本例中您不知道。即便如此,您仍然会收到该层次结构级别中存在的 blob。
过滤器功能仅调整包中包含的对象,因此您可以通过排除其深度以下的所有对象来指定仅包含一个树对象。传递这些参数是git rev-list --objects
为了使包生成排除您不感兴趣的内容。否则,默认情况下将包含您请求的范围内的每个可到达的对象。
归档时间: |
|
查看次数: |
137 次 |
最近记录: |