什么是git clone --filter选项的语法?

时间:2018-04-19 09:34:16

标签: git

Git 2.17 changelog描述了这个选项:

  
      
  • 克隆的机器&获取,反过来涉及包装和   解包对象,已被告知如何使用
    省略某些对象   另一个主题引入的过滤机制。它现在知道了   将最终包装标记为承诺包,以容忍失踪   对象,为"狭窄"奠定基础。克隆。
  •   

这个标志是否可以使用,或者它很可能非常不稳定?有谁知道正确的语法传递?我传递的任何标志都被拒绝为无效的过滤器规范。例如,这些是我尝试按目录过滤的:

git clone file://path --depth=1 --filter '--subdirectory-filter Assets' TestRepo
git clone file://path --depth=1 --filter --subdirectory-filter Assets TestRepo
git clone file://path --depth=1 --filter Assets TestRepo

3 个答案:

答案 0 :(得分:4)

过滤器规格的格式在git rev-list --help的选项部分中定义。您也可以see it on github。这是当前的内容:

  

-filter = <过滤器规格>

     

仅对--objects *之一有用;从打印对象列表中删除对象(通常是斑点)。 可能是以下之一:

     

--filter=blob:none格式省略了所有斑点。

     

格式--filter=blob:limit=<n>[kmg]忽略了大于n个字节或单位的blob。 n可以为零。后缀k,m和g可用于命名KiB,MiB或GiB中的单位。例如,blob:limit = 1k与blob:limit = 1024相同。

     

--filter=sparse:oid=<blob-ish>格式使用blob(或blob-expression)中包含的稀疏校验规范来省略请求的引用上的稀疏校验不需要的blob。< / p>      

表单--filter=sparse:path=<path>同样使用中包含的稀疏签出规范。

答案 1 :(得分:2)

  

该选项没有我希望的有用。 (它不能用于合并克隆和过滤分支。

然而,此过滤机制是与克隆关联的机制的扩展,用于实现partial cloning (or narrow clone) introduced in Dec. 2017 with Git 2.16

但是您的Git回购托管服务器必须支持目前受支持的 protocol v2 (2018年10月)only by GitLab

这意味着您可以将--filtergit clone一起使用,如最近的Git 2.20补丁所示(请参见下文)。

然后将该过滤器添加到this patch series中的git fetch
它是a new pack-protocol capability "filter", added to the fetch-pack and upload-pack negotiation.
的一部分 请参阅"filter" in Documentation/technical/pack-protocol,它指向the rev-list options

在Git 2.20(2018年第四季度)中,配置为延迟获取丢失对象的部分克隆将按需向发起方发出“ git fetch”请求 存储库以填充尚未获得的对象。
该请求已针对请求树对象(而非叶子Blob)进行了优化 告诉原始存储库,其中包含的对象) 不需要斑点。

请参见commit 4c7f956commit 12f19a9Jonathan Tan (jhowtan)(2018年10月3日)。
(由Junio C Hamano -- gitster --commit fa54ccc中合并,2018年10月19日)

  

fetch-pack:在延迟获取树时排除斑点

     

可以使用“ git clone --filter=tree:none <repo> ”获得缺少树的部分克隆。
  在这样的存储库中,当需要懒惰地获取树时,无论原始命令是否需要这些对象,或者本地存储库中是否已有其中一些对象,直接或间接引用的任何树或blob也将被获取。 / p>      

这是因为延迟获取使用的获取协议没有   允许客户端请求仅发送所需的对象,从而   将是理想的解决方案。该补丁实现了部分解决方案:   指定“ blob:none”过滤器,从而在某种程度上减少了获取负载。

     

当延迟获取Blob时,此更改无效(由于过滤器的方式   工作)。如果懒惰地获取提交(这样的存储库很困难   构建,不是很好的用例,但是它是   可能),仍会提取引用的提交和树-仅   无法获取Blob。

     

必要的代码更改在fetch_pack()中完成,而不是在某个地方完成   更靠近将“过滤器”指令写入导线的位置,以便   只需要更改一部分代码即可为所有用户   协议版本可从此优化中受益。

您可以通过以下方式看到进一步的优化:

请参见commit e70a303commit 6ab4055commit 0177565commit 99bcb88Jonathan Tan (jhowtan)(2018年9月27日)。
(由Junio C Hamano -- gitster --commit 0527fba中合并,2018年10月19日)

  

运输:允许跳过参考清单

     

get_refs_via_connect()函数均执行握手   (包括确定协议版本)并获取列表   远程参考。

     

但是,获取协议v2支持获取对象而无需引用列表,因此用户可以通过创建新的handshake()函数来跳过列表


请注意,随着Git 2.21(Q1 2019)及其协议消息规范的更新,语法已更改/发展,仅允许有限地使用缩放数量。这样可以确保不会出现潜在的兼容性问题。

请参见commit 87c2d9dJosh Steadmon (steadmon)(2019年1月8日)。
请参见commit 8272f26commit c813a7cMatthew DeVore (matvore)(2019年1月9日)。
(由Junio C Hamano -- gitster --commit 073312b中合并,2019年2月5日)

  

filter-options:展开缩放数字

     

与远程服务器或子进程通信时,请使用   扩展数字,而不是带有后缀的数字   对象过滤器规范(例如,“ limit:blob=1k”变成“ limit:blob=1024”)。

     

更新协议文档以注意客户端应始终执行此扩展,以允许服务器之间的更多兼容性   实施。

答案 2 :(得分:0)

git clone --filter子模块版本。

(有关常规存储库 git clone --filter,请参阅 my previous answer

子模块(稀疏结账)的部分克隆的概念已经开始出现:

在 Git 2.29(2020 年第 4 季度)中,即使设置了 clone --filter,这种惰性/部分 transfer.fsckobjects 也适用于子模块。

请参阅 commit 1b03df5Jonathan Tan (jhowtan)(2020 年 8 月 20 日)。
(2020 年 8 月 31 日于 Junio C Hamano -- gitster --commit 63728e4 合并)

<块引用>

fetch-pack:在部分克隆中,通过--promisor

签字人:Jonathan Tan

<块引用>

从promisor remote获取包时,需要创建相应的.promisor文件。
"fetch-pack" 最初是通过将 "--promisor" 传递给 "index-pack" 来实现的,但在 5374a290aa ("fetch-pack: write fetched refs to .promisor" , 2019-10-16, Git v2.25.0-rc0 -- merge 列于 batch #1),“fetch-pack”被教导要自己做这件事,因为它需要将 ref 信息存储在.promisor 文件。

这会在设置transfer.fsckobjects时导致superprojects出现问题,因为在当前的实现中,是“index-pack”调用fsck_finish()来检查对象;在 5374a290aa 之前,fsck_finish() 会看到 .gitmodules 是一个承诺对象并容忍它丢失,但之后,没有 .promisor 文件(在调用fsck_finish() by "index-pack") 告诉它 .gitmodules 是一个承诺对象,因此它返回一个错误。

因此,再次教“fetch-pack”将“--promisor”传递给索引包。
fetch-pack”随后将使用引用信息覆盖此文件。

另一种方法是将对象检查移至“fetch-pack”,并让“index-pack”仅索引文件。
但是,由于“index-pack”必须膨胀对象才能对其进行索引,因此让它检查对象(这也需要膨胀的文件)似乎是合理的。


使用 Git 2.33(2021 年第 3 季度),为从承诺远程获取子模块中的对象做准备。

请参阅 commit ef830cccommit d1fa943commit 69bb2e1commit ef7dc2ecommit ebaf3bcJonathan Tan (jhowtan)(2021 年 6 月 17 日)。
(由 Junio C Hamano -- gitster --commit 8721e2e 合并,2021 年 7 月 16 日)

<块引用>

promisor-remote:在任何 repo 中教授lazy-fetch

签字人:Jonathan Tan
审核人:Elijah Newren

<块引用>

这是支持部分克隆子模块的一步。

即使在这个补丁之后,我们仍然缺乏部分克隆子模块的支持,主要是因为许多访问子模块对象的 Git 代码是通过添加它们的对象存储作为替代来实现的,这意味着在子模块中发生的任何延迟获取都会基于超级项目的配置,而不是子模块的配置。
这也阻止了通过面向用户的命令测试此补丁中的功能。