如何用 `git` 隐藏不需要的 upstream 组件并保持更新能力?
使用 Git 自带的稀疏检出(git sparse-checkout),就能只把需要的组件放进工作目录,其余组件不检出,同时仍可正常拉取 upstream 更新,无须安装扩展。
这里的“隐藏”仅限于工作目录:被排除的文件不会出现在其中,普通的 ls、find 和构建工具也就无法在那里遍历到它们。这些文件仍属于仓库,Git 可以读取对应的提交内容,因此稀疏检出不提供访问隔离。Git 稀疏检出文档
为什么不必删除组件或另建精简分支
Git 区分提交中的文件和工作目录里实际检出的文件。使用稀疏检出后,Git 知道某些文件是有意不检出的,不会将它们视为待提交的删除。Git 稀疏检出原理
如果直接删除组件并提交,就会产生真正的删除变更。以后上游修改这些文件时,可能出现修改与删除之间的冲突。
创建分支本身不会妨碍更新,分支上的改动才需要持续维护。如果只是想减少本地文件,就没有必要提交一份删除数百个组件的补丁。
只检出需要的组件
以下假设组件是同一个仓库中的普通目录,上游分支名为 main。使用时请替换示例仓库地址、分支名和目录名。
git clone --sparse --origin upstream --branch main \
https://example.com/vendor/project.git project
cd project
git sparse-checkout set --cone \
components/component-a \
components/component-b \
components/component-c \
shared \
build-support
--origin upstream 将远程仓库命名为 upstream。--sparse 避免首次克隆时展开整个工作目录,随后用 set 指定需要的目录。Git clone 文档
示例列出了三个组件。实际使用时,请补齐所需的约 20 个组件,以及公共代码、构建脚本等依赖目录。
如果已经克隆了仓库,可以直接执行上述 git sparse-checkout set --cone ...。操作前先保存本地改动,并检查是否有需要保留的未跟踪文件。
继续获取上游更新
如果当前分支只用于跟随上游,可以执行:
git pull --ff-only upstream main
--ff-only 只允许快进更新。如果本地和上游历史已经分叉,命令会停止。如果你维护了自己的提交,就需要按项目约定选择 merge 或 rebase,并处理可能出现的冲突。Git pull 文档
稀疏规则不会把更新范围限制在那 20 个组件。仓库仍会接收上游提交,工作目录则按规则保留需要的文件。
以后要加入一个组件,可以执行:
git sparse-checkout add components/component-d
查看当前选择的目录,或恢复完整工作目录:
git sparse-checkout list
# 恢复所有受跟踪文件
git sparse-checkout disable
“完全隐藏”有哪些限制
--cone 按目录选择内容,同时还会保留仓库根目录及所选目录各级祖先目录中的直属文件。例如,选择 components/component-a 时,根目录的 README.md 和 components/ 下直属的文件仍可能存在,其他未选中的组件子目录则不会被检出。
如果必须精确控制单个文件,可以使用 --no-cone 的模式匹配。不过,该模式的规则和性能限制更多,官方文档不推荐在一般场景中使用。目录选择规则
稀疏检出也不能保证工作目录中始终没有额外文件:
- 未跟踪文件或本地改动可能使某些目录无法收起。
- merge 或 rebase 为处理冲突,可能临时检出规则之外的文件。
处理完相关改动或冲突后,可以重新应用规则:
git sparse-checkout reapply
稀疏检出适合控制日常工作目录中的文件,但无法保证在任意 Git 操作后都严格只剩指定文件。Git 稀疏检出命令说明
如果还想减少下载量
稀疏检出主要减少工作目录中的文件。新克隆大仓库时,还可以结合部分克隆(partial clone):
git clone --filter=blob:none --sparse \
--origin upstream --branch main \
https://example.com/vendor/project.git project
然后照常运行 git sparse-checkout set --cone ...。
如果服务端支持过滤,--filter=blob:none 会推迟下载文件内容,等 Git 实际需要时再获取。被排除组件的内容以后仍可能下载,例如读取历史文件时就可能触发下载。部分克隆参数说明
Git 只能选择路径,无法判断组件之间的依赖。能否成功构建、构建是否变快,仍取决于项目的构建规则。如果顶层脚本固定要求所有组件存在,就需要使用项目提供的组件选择配置,或调整构建脚本。
备注:内容仅供参考。
