Git只克隆远程仓库的某一个目录或文件

开源 0

一、研究背景

最近需要查看之前写的代码,需要从远程仓库拉取项目,但仓库项目太大直接克隆的话,下载时间比较慢,因此研究如何使用git只克隆需要的目录文件。下面是查看目录文件大小的命令:

# 查看.git文件的大小du -sh .git# 查看当前项目目录的大小du -sh .# 列出当前目录所有文件及大小du .

下图是一个仓库的直接git克隆测试,发现项目.git文件大小为4.2M,整个项目目录大小为9.9M。

但是我们并不要远程仓库项目的所有文件,那应该怎么实现只克隆某一个目录或文件呢?

二、实践步骤

要实现只克隆某一个目录或文件,可以使用Git提供的方法,包括稀疏克隆和sparse-checkout操作。

2.1、稀疏克隆

过滤掉Blob文件,可以减少git克隆时的下载量。

# 过滤掉blob文件git clone --filter=blob:none --sparse <your-git-url>
  • --filter=blob:none:指定克隆过程中不包含任何 blob 对象(文件内容),只克隆 commit 对象、tree 对象、tag对象。这可以大大减少克隆操作所需要的时间和存储空间,特别适用于大型仓库,减少不必要的数据传输和占用空间。

  • --sparse:该参数告诉 Git 使用稀疏(sparse)克隆的方式来克隆仓库。稀疏克隆是一种仅克隆部分文件和目录的方式,而不是将整个仓库都完整地克隆下来,有助于减少克隆所需的时间和空间。

该命令的含义是开启git稀疏克隆,并下载除了具体的文件内容Blob对象之外的其他对象文件,包括tree对象、commit对象、tag对象,以保证git历史记录和项目目录结构的完整性。这样可以实现快速、高效地克隆大型仓库,并节省存储空间。在过滤掉Blob文件后,只包含了一小部分文件,整个克隆下载的来的项目大小只有428k。但是并没有包含我们需要的目录或文件。

2.2、指定拉取(sparse-checkout)

使用git sparse-checkout命令来指定从git远程仓库拉取我们所需要的目录或文件到工作目录中,执行以下命令:

# 指定git拉取的目录文件git sparse-checkout add <your-folder># 或者git sparse-checkout set <your-folder>

添加front-end/seven-house-manage/src/views/dashboard之后,本地项目目录就会出现front-end/*相关文件,项目目录大小为576k,如下图所示。到这里基本就实现了git只拉取某一个目录或文件。

设置关注的目录,之前下载关注的front-end/seven-house-manage/src/views/dashboard就会被删掉,转到src目录下我们可以执行git相关操作并不会受到影响,包括打标签、新建分支、提交代码等。

# 设置关注的目录git sparse-checkout set <your-folder>

2.3、文件对象

如果你想要查看文件对象类型或其他信息,可以使用以下命令:

# 查看特定文件的对象类型和哈希值git cat-file -p HEAD:<file_path>

<file_path> 替换为你要查看的文件的路径。

# 查看特定文件所在目录的内容git ls-tree HEAD <directory_path>

<directory_path> 替换为你要查看的目录的路径。

三、参考文献

【GitFAQ-如何在一个大型项目中只克隆一个目录】

Git - git-sparse-checkout Documentation (git-scm.com)

也许您对下面的内容还感兴趣: