likes
comments
collection
share

使用 Git Sparse Checkout 拉取远程指定文件或目录

作者站长头像
站长
· 阅读数 33

前面我们 基于node 实现git clone拉取远程仓库代码。但在业务需求中我不需要将整个仓库进行克隆,我只需要能够拉取到指定的文件到本地。

通过研究发现我们可以使用 GitSparse Checkout 功能来实现。

什么是 Sparse Checkout?

Sparse CheckoutGit 提供的一种功能,它允许我们在拉取远程仓库时只拉取部分文件,而不是整个仓库。这样可以节省时间和磁盘空间。

为了解决 Git 拉取大型仓库时过多冗余信息的问题而引入的功能。Git 拉取仓库时,如果不进行限制,会拉取整个仓库的所有文件和历史记录,这会占用大量的存储空间和网络带宽,而且会导致拉取时间过长。这对于一些大型仓库,如 Linux 内核源码仓库,是非常不友好的。

Sparse Checkout 可以让用户只拉取部分仓库内容,而不是全部拉取,从而减少存储空间、网络带宽和拉取时间。这个功能的实现是通过在仓库中添加 .git/info/sparse-checkout 文件,并在其中列出需要拉取的文件和目录路径。

需要注意的是,Sparse Checkout功能需要Git版本在1.7.0及以上,而且只能用于Git仓库的clone和pull操作。

使用 Sparse Checkout 步骤:

  1. 创建本地仓库:使用 Git init 命令初始化本地仓库。
  2. 设置与远程仓库的连接:使用 git remote add origin repoUrl 命令将本地仓库和远程地址进行关联,repoUrl 为远程仓库地址。
  3. 启用sparse-checkout功能git config core.sparsecheckout true
  4. 将要拉取的文件路径写入 sparse-checkout 文件,位于.git/info/sparse-checkout。 注意写入的文件名称不要有特殊字符会导致拉取失败 的
    echo "path/to/directory/" >> .git/info/sparse-checkout
    echo "path/to/file" >> .git/info/sparse-checkout
  1. 更新仓库,只拉取指定文件
   git pull origin master

代码案例

新建 sparse-checkout.js 文件并写入以下代码

/**
 * 基于 sparse checkout 实现远程仓库指定文件拉取
 */
const { execSync } = require('child_process');
const { join } = require('path');

const repoUrl = 'https://github.com/xxx/xxx.git'; // 远程仓库地址
const filePath = 'test/*'; // 要拉取的文件路径

// 创建临时目录用于克隆仓库
const tempDir = join(__dirname, 'temp');
execSync(`mkdir -p ${tempDir}`);

// 进入临时目录
process.chdir(tempDir);
execSync(`git init`);
// 设置远程仓库地址到本地
execSync(`git remote add origin ${repoUrl}`);

// 进入仓库目录
process.chdir(join(tempDir));

// 开启 Sparse Checkout
execSync(`git config core.sparsecheckout true`);

// 将要拉取的文件路径写入 Sparse Checkout 文件
execSync(`echo ${filePath} >> .git/info/sparse-checkout`);

// 更新仓库,只拉取指定文件
execSync(`git pull origin master`);

在命令行通过node运行文件

node .\sparse-checkout.js 

控制台输出

使用 Git Sparse Checkout 拉取远程指定文件或目录

检查目录,发现生成了指定目录temp,并且里面包含指定拉取的 test 文件信息,并没有把整个仓库给拉取下来

使用 Git Sparse Checkout 拉取远程指定文件或目录

我们打开 .git/info/sparse-checkout 文件看一下,正是我们写入的指定文件,当我们开启了Sparse Checkout git 在拉取的时候会根据 sparse-checkout 文件内容进行过滤拉取指定的文件信息

使用 Git Sparse Checkout 拉取远程指定文件或目录

设置多个文件路径

如果要设置多个文件路径,在.git/info/sparse-checkout 中每一行都是一个需要拉取的文件或目录的相对路。

我们可以将多个文件路径拼接成一个字符串,然后使用重定向符号 >> 将字符串写入到 .git/info/sparse-checkout 文件中,例如:

const filePaths = ['file1.txt', 'file2.txt', 'file3.txt'];
const filePathsString = filePaths.join('\n');
execSync(`echo "${filePathsString}" >> .git/info/sparse-checkout`);

使用 Sparse Checkout 可以方便地拉取远程仓库的指定文件或目录到本地,这对于开发和维护项目来说都是非常有用的。