你是不是也遇到过这样的情况:想 clone 一个 ref="/tag/2021/" style="color:#EB6E00;font-weight:bold;">GitHub 上的开源项目,结果等了十分钟还没下完,一看磁盘占用暴涨几十个 G?点开项目一看,里头塞满了 .psd、.mov、.zip 包,甚至还有整套虚拟机镜像——这些根本不是代码,却硬生生拖垮了克隆速度和本地空间。
为什么普通 clone 会拉下所有大文件?
Git 默认是“全量快照”机制:每次 commit 都记录整个工作区的状态。哪怕你只改了一行 Python,只要历史中某次提交加过一个 2GB 的视频,那这个视频就会永远留在 Git 对象库里。clone 时,Git 会把整个历史对象一股脑下载下来,不管你需不需要。
方案一:用 sparse-checkout 只检出需要的目录
适合项目结构清晰、大文件集中在特定文件夹(比如 assets/、data/)的情况。
先创建空仓库并启用稀疏检出:
git clone --no-checkout https://github.com/user/repo.git
cd repo
git sparse-checkout init --cone
git sparse-checkout set src docs README.md上面命令只让 Git 下载 src 目录、docs 和 README.md,其他一律跳过。执行后运行 git checkout,就能立刻拿到轻量版代码,几百 MB 的 assets/videos/ 根本不会出现在你硬盘上。
方案二:用 Git LFS 管理大文件(项目已支持时)
如果项目作者已经用 Git LFS(Large File Storage)把大文件“托管”出去了,那它在仓库里实际只存一个指针文本,真正的文件存在 LFS 服务器上。你只需装好 Git LFS 客户端,clone 就会自动跳过下载大文件本体:
git lfs install
git clone https://github.com/user/repo.gitclone 完后,你看到的是带 LFS 标记的占位符(比如 video.mp4 文件只有几 KB)。需要时再单独用 git lfs pull 下载,不拉就不占地方。
方案三:跳过历史,只取最新快照(--depth 1)
如果你只是想跑一下 demo 或查个函数,根本不需要看 commit 历史,加个 --depth 1 能省掉 90% 的数据:
git clone --depth 1 https://github.com/user/repo.git这相当于只下载最新的那一层 commit,连 git log 都看不到前几页,但代码绝对是最新的,而且秒下。对学习、调试、CI 构建特别友好。
顺手清理:已经 clone 完了,还能删大文件吗?
能。进到仓库目录,用 git ls-tree -r --long HEAD | sort -k3nr | head -20 查出最大的 20 个对象,再结合 git filter-repo(需安装)重写历史剔除它们。不过这是进阶操作,日常建议优先用前面三种“防患于未然”的方式。
电脑工场提醒:别再傻等 clone 结束了——看清项目有没有 .gitattributes、有没有 LFS 提示、有没有 assets 目录,选对方法,30 秒搞定一个“干净版”仓库。