6

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

更多背景信息:由于 GitHub 在 pack 协议中缺乏过滤规范支持,我一直在尝试构建一种方法来获取多 GB 存储库,其中单个提交也包含多个 GB。我的想法是使用获取包请求(或在服务器上上传包),want仅指定一个提交对象,然后从那里获取该对象,获取它引用的树,在另一个请求中获取树对象,然后手动指定哪个我想要从那里得到的 blob 和树对象。但我发现,pack 协议似乎是从为您“想要”的特定提交或树提供尽可能多的数据的角度运行的。

这对我正在做的事情意味着每当我指定一个树哈希的提交时,我不仅得到提交或树对象,而且还得到它们包含的每个对象。在使用加深设置来限制我想要的提交次数时也会发生这种情况;0 不产生任何结果,而 1 产生上述结果。我已经验证了want仅指定 blob 的 a 确实会生成仅包含该 blob 的包文件,因此该部分确实可以按预期工作。

4

2 回答 2

3

除非启用过滤器功能,否则您请求的内容在 Git 协议中是不可能的。

Git 协议一直被设计为有效地交换一组提交。Git 在服务器端实现获取协议的方式是,它将客户端的have提交标记为无趣,然后将修订从请求的内容向下移动到无趣的点,包括这些点之间可到达的所有必要对象。这种方法必然要求你所走的点是提交的。

可以发送对树对象的请求,但服务器端不会按照您的预期进行。您最终会得到该树以及包中所有可从其访问的内容(所有 blob 和其他树),这将比您想要的数据多得多。同样,如果您考虑一下 Git 协议的工作原理,这非常有意义:用户已经请求了从此时可访问的所有对象。

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

The filter functionality just adjusts the objects that are included in the pack, so you can specify that only the one tree object is to be included by excluding everything below its depth. These arguments are passed to git rev-list --objects so that the pack generation will exclude the things you're not interested in. Otherwise, the default is to include every reachable object within the range you've requested.

于 2019-08-31T03:30:59.173 回答
0

您正在询问如何将远程存储库视为本地对象数据库。做到这一点的方法是让文件系统访问远程存储库的对象 db,例如通过壳进入安装了该对象 db 的系统或通过在本地安装包含它的文件系统。

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

是的,否则你最终会得到一个损坏的存储库。如果你这样做,你可以按照上面提到的那样做,绕过 Git 的一致性检查,只在一个挂载的对象数据库上自己运行 pack-objects,它接受标准输入上的任意 sha,并用你要求的对象编写一个包。将输出包放入任何存储库的对象目录中,瞧,该存储库具有这些对象。

于 2019-08-26T05:49:46.280 回答