git clone仓库指定子目录

有时候,我们仅仅需要git代码仓库的一部分,例如一个子目录的数据。

我在 本地化部署DeepSeek-R1 CPU架构 遇到这个问题,我只需要 unsloth/DeepSeek-R1-GGUF 仓库中的一个子目录 DeepSeek-R1-Q8_0 数据来部署满血版(8位量化)DeepSeek 该如何避免clone整个巨大的git仓库呢?

主要有3种方法:

  • 使用 sparse checkout ,这是最常用的方法

  • 使用 git 归档

  • 使用 partial clone (需要Git 2.19+)

备注

我最终因为下载文件量不多,并且我需要通过阿里云服务器中转,所以还是直接采用 wget 完成,本文作为后续参考

Sparse Checkout

使用稀疏检出(sparse checkout)可以只check out某个部分工作目录,例如对于大型仓库,可能只需要部分子目录:

以下举例 https://huggingface.co/unsloth/DeepSeek-R1-GGUF 仓库下的子目录 DeepSeek-R1-Q8_0 :

使用git的 sparse checkout clone出部分目录
# 先clone仓库,但是使用 --no-checkout 避免直接checkout出文件
git clone --no-checkout https://huggingface.co/unsloth/DeepSeek-R1-GGUF
cd DeepSeek-R1-GGUF

# 激活sparse checkout
git sparse-checkout init

# 定义子目录,也就是只checkout指定子目录
git sparse-checkout set DeepSeek-R1-Q8_0

# checkout 子目录,这里 main 是分之,而这个分支下只有设置为稀疏检出的 DeepSeek-R1-Q8_0 会下载
git checkout main

使用git archive

使用 git archive 命令可以对某个子目录进行归档( tar 格式),所以通过管道 | 加上 tar 命令解包就可以完整clone出一个子目录:

通过 git archive 来获得子目录
# 语法: git archive --remote=<repository-url> HEAD:<subdirectory> | tar -x

git archive --remote=https://huggingface.co/unsloth/DeepSeek-R1-GGUF HEAD:DeepSeek-R1-Q8_0 | tar -x

部分clone(需要Git 2.19+)

部分clone功能可以只fetch需要的对象,虽然这个方法不如 sparse checkout 精确,但是减少了传输的数据量

部分clone
# 使用 --filter 选项排除large blobs,虽然这不是直接指定子目录,但是可以实现减少下载量
git clone --filter=blob:none https://huggingface.co/unsloth/DeepSeek-R1-GGUF
cd DeepSeek-R1-GGUF

# 配置Sparse Checkout
git sparse-checkout init
git sparse-checkout set DeepSeek-R1-Q8_0
git checkout main

参考