在开发嵌入式项目时,需要接触uboot、linux等大型的代码库,全部拉取该库后项目中充满了与项目不相关的代码,比如不同设备的bsp代码。不同体系结构的CPU库代码等等。这些文件存在项目中,对代码分析与代码管理造成很大的干扰,出于需要保持项目代码的完整性的目的,又不能粗暴的将不相关的代码直接删除,有没有一种方法,只检出与项目相关的部分代码,又不破坏整个项目的文件结构?
git为了提高大仓库的检出效率, 从1.7版本后开始提供了部分代码检出功能,针对大仓库进行性能优化,
该功能就是:稀疏检出(git-sparse-checkout)
该方法提供了为本地代码库检出指定的代码,而不将所有的代码都检出到工作区,提高了代码的检出效率,使工程目录更精简方便。
在实际中,只需对git做要简单的配置便可开启此项功能。
配置方法:
-
1 设置core.sparseCheckout true
-
2 创建新文件.git/info/sparse-checkout
-
3 配置文件内容到 .git/info/sparse-checkout
后续git的操作,checkout,add,commit等跟之前的使用git操作是一致的
配置实例
以 rt-thread为例,在实际的开发中,移植rtt到一个新的板子上运行,该芯片为risc-v,在项目中只想保留os与risc-v相关的代码,
其他的代码不用检出,并且不影响整个库的完整性。
A 已存在项目的配置
如果项目仓库已经检出,只是需要将不相关的代码移除
1 开启sparsecheckout配置
$ git config core.sparsecheckout true
2 添加sparse-checkout 文件
$ touch .git/info/sparse-checkout
3 修改sparse-checkout文件内容
该文件支持通配符 '*','!',其中 '*' 可以匹配所有项,'!' 指排除项
参考内容如下:
/* // 检出所有文件
!/bsp/* // 屏蔽bsp下的所有内容
/bsp/nuclei/* // 添加bsp中相关芯片目录
!/libcpu/* //屏蔽libcpu下所有内容
/libcpu/risc-v/common //添加risc-v相关目录
/libcpu/risc-v/SConscript //添加编译相关文件
/libcpu/Kconfig //添加libcpu下编译相关文件
/libcpu/SConscript
4 $git checkout origin master
B 新项目的配置
全新的本地仓库,只检出相关的代码
1 创建新文件夹
$ mkdir rt-riscv && cd rt-riscv
2 初始化本地仓库
$ git init rt-riscv
3 配置仓库地址
$ git remote add origin git@gitee.com:rtthread/rt-thread.git // 配置git仓库地址
4 开启sparsecheckout配置
$ git config core.sparsecheckout true
5 添加 sparse-checkout 文件
$ touch .git/info/sparse-checkout
6 修改sparse-checkout文件内容
该文件支持通配符 '*','!',其中 '*' 可以匹配所有项,'!' 指排除项
参考内容如下:
/* // 检出所有文件
!/bsp/* // 屏蔽bsp下的所有内容
/bsp/nuclei/* // 添加bsp中相关芯片目录
!/libcpu/* //屏蔽libcpu下所有内容
/libcpu/risc-v/common //添加risc-v相关目录
/libcpu/risc-v/SConscript //添加编译相关文件
/libcpu/Kconfig //添加libcpu下编译相关文件
/libcpu/SConscript
7 $git checkout origin master
关闭sparse checkout功能
git sparse-checkout disable