先说说我们项目的代码结构。物联网项目跟纯软件不一样,它包含嵌入式端代码(比如STM32、ESP8266这些)、后端服务(比如用Go或者Java写的)、前端应用(比如Vue或者React),还有硬件设计文件(比如PCB原理图)。这么多东西,如果还按传统方式一个仓库放所有,那每次同步都得拉取一堆不相关的文件,效率太低。
我们的做法是用Git子模块(Submodule)来管理。顶层一个主仓库,里面不放具体代码,只放各个子模块的引用。比如:
firmware/ 设备固件(对应不同硬件型号)
cloud/ 云端后台
mobile/ 移动端应用
hardware/ 硬件设计文件
每个子模块都是独立的Git仓库,有自己的分支策略。比如firmware子模块,我们为每个硬件型号创建独立分支(比如esp32-v1、stm32-v2),公共的驱动代码放在master分支,通过合并或者衍合来同步更新。这样搞,硬件团队在各自分支开发,不用操心其他型号的代码,测试稳定后再合并到主分支。
再说说版本发布。物联网项目最怕的就是固件升级出问题,所以版本管理必须严格。我们用Git标签来标记每个发布版本,标签命名规则是"设备类型-版本号-日期",比如"esp32-v1.2.3-20240520"。打标签的时候,我们还会用注解记录这次更新的主要内容,比如修复了哪些bug,新增了哪些功能。这样出了问题需要回滚的时候,能快速定位到对应的稳定版本。
物联网项目经常需要多环境测试,比如开发环境、测试环境、生产环境。我们利用Git分支来对应不同环境:develop分支对应开发环境,release分支对应测试环境,master分支对应生产环境。每次功能开发都在feature分支进行,完成后再合并到develop分支。测试通过后,把develop分支合并到release分支,进行更全面的测试。最后,release分支才合并到master分支,用于生产环境部署。
对于需要保密的配置信息,比如Wi-Fi密码、API密钥这些,我们用的是Git忽略文件(.gitignore)配合配置模板。实际配置文件不入库,只提交一个模板文件(比如config.h.template),里面用占位符代替真实信息。这样新成员克隆代码后,根据模板创建自己的配置文件,不会把敏感信息泄露出去。
最后说说团队协作。物联网项目涉及嵌入式工程师、后端开发、前端开发、硬件工程师,大家对Git的熟悉程度不一样。我们制定了简单的Git工作流:嵌入式团队用SourceTree这类图形化工具,后端团队用命令行,前端团队用VS Code内置的Git功能。关键是统一规范:提交信息必须写清楚修改内容和影响范围,比如"fix(esp32): 修复Wi-Fi重连机制"或者"feat(cloud): 增加设备状态查询接口"。
当然,过程中也踩过不少坑。比如有一次,硬件团队误把一个大文件(原理图备份)提交到了仓库,导致仓库体积暴涨。后来我们用git filter-branch清理历史记录,才把仓库瘦身。从那以后,我们设置了pre-commit钩子,检查是否提交了不该提交的大文件。
总的来说,Git在物联网项目里不仅能管理代码,还能协调硬件、软件不同团队的开发节奏。关键是要根据项目特点设计合适的分支策略和仓库结构。希望我们这些实践经验对正在做物联网项目的朋友有所启发。如果你们有更好的做法,欢迎在评论区交流。