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
答案 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。
这意味着您可以将--filter
与git 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 4c7f956的commit 12f19a9,Jonathan 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 e70a303的commit 6ab4055,commit 0177565,commit 99bcb88,Jonathan 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 87c2d9d的Josh Steadmon (steadmon
)(2019年1月8日)。
请参见commit 8272f26的commit c813a7c,Matthew 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 1b03df5 的 Jonathan 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 ef830cc 的 commit d1fa943、commit 69bb2e1、commit ef7dc2e、commit ebaf3bc、Jonathan Tan (jhowtan
)(2021 年 6 月 17 日)。
(由 Junio C Hamano -- gitster
-- 于 commit 8721e2e 合并,2021 年 7 月 16 日)
promisor-remote
:在任何 repo 中教授lazy-fetch签字人:Jonathan Tan
审核人:Elijah Newren
这是支持部分克隆子模块的一步。
即使在这个补丁之后,我们仍然缺乏部分克隆子模块的支持,主要是因为许多访问子模块对象的 Git 代码是通过添加它们的对象存储作为替代来实现的,这意味着在子模块中发生的任何延迟获取都会基于超级项目的配置,而不是子模块的配置。
这也阻止了通过面向用户的命令测试此补丁中的功能。