新git sparse-checkout
命令(在 Git 2.25(2020 年第一季度)中引入)来自 Microsoft 基于其Scalar项目的贡献
在 Microsoft,我们支持使用VFS for Git(以前称为 GVFS)的Windows 操作系统存储库。VFS for Git 使用虚拟化文件系统绕过许多关于存储库大小的假设,使 Windows 开发人员能够以以前认为不可能的规模使用 Git。
在支持 Git 的 VFS 的同时,我们使用自定义跟踪系统并收集用户反馈来识别性能瓶颈。
我们为 Git 客户端做出了多项贡献,包括提交图文件和对.git push
sparse-checkout
基于这些贡献和对 Git 的许多其他最新改进,我们开始了一个项目来支持非常大的存储库,而无需虚拟化文件系统。
因此,Scalar 项目(2021 年中)从 Git 的VFS修改版本转变为围绕核心 Git 功能的瘦壳。
Scalar 可执行文件现在已被移植到包含在microsoft/git fork中。
Derrick Stolee的 2020 年文章“通过稀疏结账缩小您的 monorepo 规模”解释了当今如何管理稀疏结账(2020+)
sparse-checkout
与现有存储库一起使用
要将工作目录限制为一组目录,请运行以下命令:
git sparse-checkout init --cone
git sparse-checkout set <dir1> <dir2> ...
如果卡住,请运行git sparse-checkout disable
以返回完整的工作目录。
该子命令设置必要的 Git 配置选项,并用表示“仅匹配根目录中的文件”的模式init
填充文件。sparse-checkout
该set
子命令使用模式修改sparse-checkout
文件以匹配给定目录中的文件。
此外,还包括直接位于指定目录的父目录中的任何文件。
例如,如果您运行git sparse-checkout set A/B
,那么 Git 将包含名称为A/B/C.txt
( 的直接子级A/B
) 和A/D.txt
( 的直接同级A/B
) 以及E.txt
( 的直接同级A
) 的文件。
例如:
构建 Android 应用程序的团队通常可以只使用其中的文件client/android
并使用当前部署的服务运行所有集成测试。
Android 团队在工作时需要的文件集要少得多。
这意味着他们可以使用git sparse-checkout set
命令限制到该目录:
$ git sparse-checkout set client/android
$ ls
bootstrap.sh* client/ LICENSE.md README.md
$ ls client/
android/
$ find . -type f | wc -l
62
git sparse-checkout
自 Git 2.32(2021 年第一季度)以来使用稀疏索引。请参阅Derrick Stolee
的文章“使用 Git 的稀疏索引让你的 monorepo 感觉很小” 。
稀疏索引在一方面不同于普通的“完整”索引:它可以存储目录路径及其树对象的对象 ID。
这是与 blob 对象配对的文件路径的补充。
由于锥模式稀疏检出模式在目录级别匹配,我们可以确定整个目录不在稀疏检出锥中,并将其包含的所有文件路径替换为单个目录路径。
稀疏目录条目对应于在稀疏结帐定义之外的目录。
这些目录也有一个缓存树节点,其范围只有一个条目:稀疏目录条目。
在 Git 2.36(2022 年第二季度)中," git update-index
" ( man )、 " git checkout-index
" ( man )和 " git clean
" ( man )被教导更好地使用稀疏结帐功能。
请参阅Victoria Dye ( )的提交b9ca5e2、提交c35e9f5、提交 e015d4d、提交 35682ad、提交 88078f5、提交 b553ef6、提交 1e9e10e、提交 1624333、提交 bb01b26(2022 年 1 月 11 日) 。(由Junio C Hamano 合并 -- --在2f45f3e 提交中,2022 年 2 月 17 日)vdye
gitster
签字人:Victoria Dye
审核人:Elijah Newren
启用稀疏索引与update-index
.
大多数update-index
工作变体没有显式扩展索引或在update-index.c
.
需要额外更改的一种用法是--cacheinfo
;如果指定了稀疏目录中的文件,则在缓存树无效之前不会扩展索引,从而导致索引和缓存树之间的不匹配。
这种情况是通过重新排列来处理的add_index_entry_with_check
,允许在尝试使相关缓存树路径无效之前index_name_stage_pos
扩展索引,从而避免缓存树/索引损坏。