基于厂商SDK开发MCU硬件抽象层,如何用Git合理管理自定义代码?
核心方案的可行性
你提出的将my_board_x直接放入SDK仓库的方案完全可以用Git实现,且是嵌入式开发中复用厂商SDK的合理思路。这种方式能最大化复用厂商的Makefile逻辑,避免修改路径或重构构建流程,同时实现SDK更新与自定义代码维护的分离。
具体Git操作步骤
初始化仓库关联
- 克隆厂商的SDK仓库到本地,将厂商仓库设置为
upstream远程:git clone <厂商SDK仓库地址> my_sdk cd my_sdk git remote add upstream <厂商SDK仓库地址> - 在自己的Git平台创建一个空仓库,将其设为
origin远程并推送初始代码:git remote add origin <自己的仓库地址> git push -u origin main
- 克隆厂商的SDK仓库到本地,将厂商仓库设置为
添加自定义代码
在本地仓库的boards目录下创建my_board_x,添加你的BSP和应用代码,提交并推送到自己的仓库:mkdir -p boards/my_board_x/{bsp,application1,application2} # 添加代码文件后 git add boards/my_board_x/ git commit -m "Add custom board my_board_x with applications" git push origin main同步厂商SDK更新
当厂商发布SDK更新时,拉取upstream的最新代码并合并到自己的分支:git fetch upstream git merge upstream/main由于你的
my_board_x是独立目录,除非厂商修改了boards目录的全局结构(比如新增了影响Makefile的配置文件),否则几乎不会出现冲突,合并成本极低。维护自定义代码
日常开发仅需针对boards/my_board_x目录下的代码进行提交、推送,完全独立于SDK的其他部分。
其他推荐方案
如果希望进一步隔离自定义代码与厂商SDK,以下两种方案也值得考虑:
Git子模块(Submodule)
将my_board_x作为独立的Git仓库,在SDK的boards目录下添加它作为子模块:
git submodule add <自定义板卡仓库地址> boards/my_board_x
这种方式既保持了SDK仓库的纯净性(不会混入自定义代码),又能完全复用厂商的Makefile结构(子模块会在boards/my_board_x路径下生成目录)。缺点是子模块的同步、更新操作相对繁琐,需要同时维护两个仓库。
Git稀疏检出(Sparse Checkout)
如果厂商SDK体积庞大,你仅需其中部分目录(如boards、devices、CMSIS),可以用稀疏检出减少本地存储占用,再添加自定义代码:
# 初始化稀疏检出 git config core.sparseCheckout true # 指定需要拉取的目录 echo "boards/" >> .git/info/sparse-checkout echo "devices/" >> .git/info/sparse-checkout echo "CMSIS/" >> .git/info/sparse-checkout # 拉取代码 git pull upstream main
之后同样可以在boards目录下添加my_board_x并提交到自己的仓库,兼顾存储效率与结构一致性。
内容的提问来源于stack exchange,提问作者Tom L.

