1

我一直在寻找一种仅克隆我的一个项目的子目录的方法。显然我找到了这个答案。它设计精良,分步解决方案很好地解释了如何实现这一点。现在最后它指的是说明这一点的文档:

“稀疏结帐”允许稀疏地填充工作目录。它使用 skip-worktree 位(参见 git-update-index(1))来告诉 Git 工作目录上的文件是否值得查看。

我的问题是我无法理解这意味着什么。我从 Git 中学到的一件事是,它是一个很棒的工具,但是在实施某些东西之前,从长远来看,了解幕后发生的事情真的可以帮助你。

所以,这里有一个问题:

稀疏结帐是如何工作的,输出是什么?

4

2 回答 2

0

提交指向一棵树。树描述了一个目录,它指向其他树、blob 或提交。其他树是子目录。Blob 是文件。提交是子模块。不考虑子模块,git checkout可以看作是将所有这些子目录和文件从数据库(在不可见目录内.git)“复制”到工作区(默认为同级.git)。Sparse-checkout 只复制一些子目录或文件。所以sparse-checkout节省了工作区的空间。不保存数据库占用的空间。

于 2017-11-29T01:15:54.623 回答
0

git sparse-checkout命令在 Git 2.25(2020 年第一季度)中引入)来自 Microsoft 基于其Scalar项目的贡献

在 Microsoft,我们支持使用VFS for Git(以前称为 GVFS)的Windows 操作系统存储库。VFS for Git 使用虚拟化文件系统绕过许多关于存储库大小的假设,使 Windows 开发人员能够以以前认为不可能的规模使用 Git。

在支持 Git 的 VFS 的同时,我们使用自定义跟踪系统并收集用户反馈来识别性能瓶颈。
我们为 Git 客户端做出了多项贡献,包括提交图文件和对.git pushsparse-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

https://i2.wp.com/user-images.githubusercontent.com/121322/72286599-50af8e00-35fa-11ea-9025-d7cbb730192c.png?ssl=1


git sparse-checkout自 Git 2.32(2021 年第一季度)以来使用稀疏索引。请参阅Derrick Stolee
的文章“使用 Git 的稀疏索引让你的 monorepo 感觉很小” 。

稀疏索引在一方面不同于普通的“完整”索引:它可以存储目录路径及其树对象的对象 ID

这是与 blob 对象配对的文件路径的补充。

由于锥模式稀疏检出模式在目录级别匹配,我们可以确定整个目录不在稀疏检出锥中,并将其包含的所有文件路径替换为单个目录路径。

https://github.blog/wp-content/uploads/2021/11/Fig-6-sparse-index.png?resize=432%2C314?w=432

稀疏目录条目对应于在稀疏结帐定义之外的目录。
这些目录也有一个缓存树节点,其范围只有一个条目:稀疏目录条目。


在 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

update-index: 与稀疏索引集成

签字人:Victoria Dye
审核人:Elijah Newren

启用稀疏索引与update-index.
大多数update-index工作变体没有显式扩展索引或在update-index.c.

需要额外更改的一种用法是--cacheinfo;如果指定了稀疏目录中的文件,则在缓存树无效之前不会扩展索引,从而导致索引和缓存树之间的不匹配。
这种情况是通过重新排列来处理的add_index_entry_with_check,允许在尝试使相关缓存树路径无效之前index_name_stage_pos扩展索引,从而避免缓存树/索引损坏。

于 2022-02-20T13:30:12.120 回答