SDK中repo,git 笔记
- Repo+Git嵌入式SDK开发核心笔记
Repo+Git嵌入式SDK开发核心笔记
适用场景:RK3588 / Linux / Android 嵌入式 SDK 版本管理与开发
一、核心概念(灵魂)
1. Manifest 仓库
路径:
.repo/manifests/定位:整个 SDK 的版本总控制器、版本清单
作用:通过 XML 文件定义:
每个子仓库(kernel、u-boot、device 等)
来自哪个远程
使用哪个分支 /commit
本质:manifest 分支 = 整套 SDK 的版本号
远程分支:厂商发布的稳定、可编译、官方版本
本地分支:你本地选中的版本入口
2. Repo 工具
管理上百个 Git 子仓库的批量工具
不编写业务代码,只负责版本对齐
所有子仓库的版本,完全由 manifest 决定
3. repo sync -c
作用:严格按照 manifest 清单,强制同步所有子仓库到官方指定版本
执行流程:
先同步
.repo/manifests/自身到最新读取当前分支下的 XML 配置
批量 checkout 所有子仓库到对应版本
结果:子仓库变为
(no branch)游离状态(正常)
二、分支结构与关系
1. Manifest 分支(版本入口)
远程分支:
origin/linux→ 官方稳定版本本地分支:
default:跟踪origin/linux,推荐使用、安全稳定linux:本地分支,若上游配置错误会导致同步失败
铁律:
切换 manifest 分支 = 切换整套 SDK 版本
manifest 分支必须正确跟踪远程官方分支
2. 子仓库分支(开发使用)
如
kernel-5.10、u-boot内部分支repo sync 完全不看子仓库的本地分支
子仓库会被 XML 配置强制覆盖版本
三、Git 核心命令(必背)
1. git fetch
作用:仅下载远程最新提交到本地缓存
特点:
不修改本地代码
不合并、不覆盖、不切换分支
生成:origin/linux(远程分支在本地的只读镜像)
2. git rebase 【SDK 开发核心】
定义:变基 = 换底座
逻辑:
把本地提交从「旧基线」拆下
重新嫁接到「最新官方基线」之上
优点:
历史线性干净
无多余合并提交
你的代码永远基于最新官方版本
禁忌:SDK 基线更新只用 rebase,不用 merge
3. git pull
=
git fetch + git merge不推荐在嵌入式 SDK 中使用
会产生网状历史,难以维护、排查问题
四、高频疑问与真相(避坑必备)
1. 两个分支提交一样,为什么一个能 sync 一个报错?
提交一样 = 代码 / XML 文件完全一致
差异点:分支上游跟踪配置(upstream)
repo sync会先同步 manifest 自身若上游指向不存在的分支(如
master),直接报错
2. repo sync 到底以什么为准?
.repo/manifests以 当前分支为准不以子仓库当前分支为准
子仓库会被强制覆盖为 XML 中的版本
3. 为什么 repo sync 后是 (no branch)?
因为 repo 直接切到一个 commit 哈希
不是切到本地分支
属于正常、标准、预期状态
4. default 分支是什么?
本地分支,跟踪远程官方
origin/linux官方版本在本地的镜像
永远不要在
default上开发写代码
5. manifests 目录的版本管理逻辑(核心疑问)
核心原则:manifest 仓库的 远程分支 = 官方 SDK 版本,但并非“一个改进一个新分支”,而是分「主版本分支」和「迭代更新」两种逻辑
版本管理方式(官方常用):
① 主版本分支(长期存在):比如
origin/linux(对应 SDK 主线版本)、origin/linux-5.10(对应 5.10 内核的稳定主线),这类分支会长期维护,用于承接日常小改进、bug 修复② 里程碑版本(标签 tag 辅助):官方发布重大版本(如 V1.0、V2.0)时,不会新建分支,而是在主分支(如
origin/linux)上打tag(如v1.0.0),标记该 commit 为“正式发布版本”,方便开发者回溯历史稳定版③ 特殊版本分支(按需新建):仅当出现“分支并行开发”需求时(如同时维护旧版 SDK 和新版 SDK),才会新建远程分支,比如
origin/linux-legacy(旧版维护)、origin/linux-next(新版测试)
官方新改进的推进逻辑:
日常小改进、bug 修复、小版本迭代:不新建分支,直接在原有主分支(如
origin/linux)上提交更新,不断向前推进(commit 叠加)重大版本升级(如内核从 5.10 升级到 6.1):通常会新建分支(如
origin/linux-6.1),作为新的主版本分支,原有分支(origin/linux-5.10)保留,仅做 bug 修复,不再推进新功能测试版、预览版:可能会新建临时分支(如
origin/linux-dev),测试稳定后,将代码合并到主分支,再删除临时分支
对开发者的影响:
跟踪主分支(如
origin/linux):执行git fetch + git rebase就能同步到官方最新改进,不用切换分支需要固定版本:可以基于主分支的某个 tag(如
v1.0.0)新建本地分支,避免被官方更新覆盖切换版本:若官方新建了新版本分支(如
origin/linux-6.1),只需修改 manifest 分支的跟踪关系,或切换 manifest 到对应分支,再执行repo sync -c即可同步整套新版本 SDK
五、SDK 开发标准工作流(永不翻车)
1. 同步官方最新基线
# 切换到正确的 manifest 分支 |
2. 创建自己的开发分支(安全隔离)
# 进入要开发的仓库 |
3. 官方更新后,刷新你的代码
git fetch origin |
六、一句话终极总结
Manifest = 版本清单
Manifest 分支 = 整套 SDK 版本
repo sync = 按清单还原官方版本
git fetch = 下载远程最新状态
git rebase = 把你的代码搬家到最新官方基线
default 分支 = 本地官方镜像,只用于同步,不用于开发
manifests 版本管理 = 主分支承接日常迭代,tag 标记正式版本,特殊需求才新建分支
七、避坑铁律
不要随意修改 manifest 分支
不要在 default 分支上写业务代码
repo sync 不会覆盖你的独立开发分支
上游配置错误是 manifest 同步失败的第一原因
SDK 基线更新永远用 rebase,不用 merge
不要随意切换 manifest 远程分支,避免同步到非预期的 SDK 版本
固定版本时,用 tag 新建本地分支,不要直接依赖主分支
(注:文档部分内容可能由 AI 生成)