大家都知道拉取远程仓库代码通过 Git 指令git clone
来拉取,然而在实际业务需求中有时候不需要将整个仓库进行克隆,我只需要能够拉取到指定的文件到本地即可。
通过研究发现可以使用 Git
的 Sparse Checkout
功能来实现。
什么是 Sparse Checkout?
Sparse Checkout
是 Git
提供的一种功能,它允许我们在拉取远程仓库时只拉取部分文件,而不是整个仓库。这样可以节省时间和磁盘空间。
为了解决 Git 拉取大型仓库时过多冗余信息的问题而引入的功能。Git 拉取仓库时,如果不进行限制,会拉取整个仓库的所有文件和历史记录,这会占用大量的存储空间和网络带宽,而且会导致拉取时间过长。这对于一些大型仓库,如 Linux 内核源码仓库,是非常不友好的。
Sparse Checkout
可以让用户只拉取部分仓库内容,而不是全部拉取,从而减少存储空间、网络带宽和拉取时间。这个功能的实现是通过在仓库中添加 .git/info/sparse-checkout
文件,并在其中列出需要拉取的文件和目录路径。
需要注意的是,Sparse Checkout
功能需要Git
版本在1.7.0
及以上,而且只能用于 Git 仓库的 clone 和 pull 操作。
Sparse Checkout 使用步骤
- 创建本地仓库:使用
Git init
命令初始化本地仓库。 - 设置与远程仓库的连接:使用
git remote add origin repoUrl
命令将本地仓库和远程地址进行关联,repoUrl
为远程仓库地址。 - 启用 sparse-checkout 功能:
git config core.sparsecheckout true
- 将要拉取的文件路径写入
sparse-checkout
文件,位于.git/info/sparse-checkout
。 (注意写入的文件名称不要有特殊字符会导致拉取失败的。)echo "path/to/directory/" >> .git/info/sparse-checkout echo "path/to/file" >> .git/info/sparse-checkout
- 更新仓库,只拉取指定文件:
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/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 可以方便地拉取远程仓库的指定文件或目录到本地,这对于开发和维护项目来说都是非常有用的。