Git sparse-checkout:只把单体仓库需要的目录检出

35 次浏览3 条回复

单体仓库很大、只想处理其中一个服务时,可以用 Git 的 sparse-checkout,工作区只保留目标目录,其他文件不会铺满编辑器。

环境:Git 2.25+。下面是一个本地可运行的小例子:

mkdir sparse-demo && cd sparse-demo
git init -q
git config user.email [email protected]
git config user.name dev
mkdir -p services/api services/web docs
printf 'api
' > services/api/README.md
printf 'web
' > services/web/README.md
printf 'docs
' > docs/README.md
git add . && git commit -qm 'init'

git sparse-checkout init --cone
git sparse-checkout set services/api
find . -maxdepth 3 -type f | sort

这时工作区里只会看到 services/api 和 Git 自己的文件。要换服务时直接执行:

git sparse-checkout set services/web

它只影响工作区,不会删掉提交历史;需要完整目录时用 git sparse-checkout disable 恢复即可。多目录一起处理也可以把目录写在同一条 set 命令里。

这个对 monorepo 挺实用。补一个容易踩的点:set 用的是 cone 模式时,参数按目录写最稳,想精确到某个文件或复杂通配规则要先切到非 cone 模式。另一个小提醒是切换分支后最好看一下 git sparse-checkout list,避免误以为文件没进分支;需要临时恢复全量时 disable,处理完再 set 回去就行。

HosuLv1#1

这个对 monorepo 挺实用。补一个容易踩的点:set 用的是 cone 模式时,参数按目录写最稳,想精确到某个文件或复杂通配规则要先切到非 cone 模式。另一个小提醒是切换分支后最好看一下 git sparse-checkout list,避免误以为文件没进分支;需要临时恢复全量时 disable,处理完再 set 回去就行。

再补一个边界:sparse-checkout 主要缩小工作区,不等于少下载仓库对象。要连网络传输量也压下来,可以再看 partial clone,例如 git clone --filter=blob:none --sparse <url>,然后用 git sparse-checkout set services/api。老仓库或需要频繁切目录时,先确认团队的 Git 版本和服务端支持情况。

隔壁空白Lv1#2

再补一个边界:sparse-checkout 主要缩小工作区,不等于少下载仓库对象。要连网络传输量也压下来,可以再看 partial clone,例如 git clone --filter=blob:none --sparse <url>,然后用 git sparse-checkout set services/api。老仓库或需要频繁切目录时,先确认团队的 Git 版本和服务端支持情况。

还有个容易混淆的地方:sparse-checkout 不会替你处理未跟踪文件,工作区里临时生成的内容还是会留着;清理时别把它们和被稀疏隐藏的已跟踪文件混为一谈。需要排查状态的话,配合 git status --short 看会更直观。