1. 项目背景与核心需求
在嵌入式Linux开发领域,RK3566作为瑞芯微电子推出的中高端处理器芯片,广泛应用于智能终端、工业控制、边缘计算等场景。官方提供的Linux SDK通常托管在Git服务器上,但实际企业开发中,我们往往需要将代码迁移到内部私有仓库(如GitLab、Gitee等)进行二次开发和版本管理。这个过程看似简单,实则暗藏诸多技术细节和操作陷阱。
我经历过多次从零开始搭建RK平台开发环境的过程,发现官方SDK迁移最容易在以下环节出问题:仓库子模块嵌套结构复杂、大文件存储(LFS)配置遗漏、历史提交记录丢失、后续官方更新难以同步。本文将基于RK3566 Linux SDK v1.3.2版本,手把手演示如何完整迁移到私有Git仓库,同时保留所有开发分支和子模块依赖。
2. 迁移前的关键准备工作
2.1 环境与工具清单
确保你的开发机已安装以下工具链:
- Git 2.30+(必须支持
--mirror参数) - Git LFS扩展(处理大文件)
- Python 3.6+(部分SDK脚本依赖)
- repo工具(Google提供的多仓库管理工具)
重要提示:RK3566 SDK中kernel和uboot仓库包含大量二进制文件(如预编译dtb),必须启用Git LFS功能,否则会导致仓库体积爆炸式增长。
2.2 获取官方SDK访问权限
瑞芯微官方SDK通常通过以下方式分发:
- 企业邮箱注册开发者账号
- 获取repo manifest仓库地址(格式如:
git://git.rock-chips.com/rk/tools/repo) - 得到SDK下载命令示例:
bash复制
repo init -u git://git.rock-chips.com/rk/rk3566/linux/manifests -b master -m rk356x_linux_release.xml
2.3 私有仓库规划建议
在自建Git服务器上预先创建以下结构的仓库群:
code复制rk3566-sdk/
├── .repo/manifests.git # 存放manifest仓库
├── kernel.git # 内核源码
├── uboot.git # bootloader
├── buildroot.git # 构建系统
└── tools/ # 各工具链仓库
建议采用相同的目录结构,便于后续与官方更新同步。
3. 完整迁移操作步骤
3.1 初始克隆官方SDK
使用--mirror参数创建裸仓库克隆,保留所有分支和标签:
bash复制mkdir rk3566-mirror && cd rk3566-mirror
git clone --mirror git://git.rock-chips.com/rk/tools/repo .repo/repo.git
git clone --mirror git://git.rock-chips.com/rk/rk3566/linux/manifests .repo/manifests.git
3.2 解析manifest文件
查看SDK的manifest文件(如rk356x_linux_release.xml),提取所有子仓库地址:
xml复制<manifest>
<remote name="origin" fetch="git://git.rock-chips.com/rk/rk3566/linux"/>
<project path="kernel" name="kernel" groups="device"/>
<project path="u-boot" name="u-boot" revision="next-dev"/>
</manifest>
3.3 批量镜像克隆子仓库
编写自动化脚本批量克隆:
bash复制#!/bin/bash
MANIFEST=".repo/manifests/rk356x_linux_release.xml"
REPO_URL_BASE="git://git.rock-chips.com/rk/rk3566/linux"
for proj in $(xmllint --xpath '//project/@name' $MANIFEST | sed 's/name="//g;s/" / /g'); do
git clone --mirror ${REPO_URL_BASE}/${proj}.git ${proj}.git
done
3.4 推送到私有仓库
在私有Git服务器创建对应仓库后,使用git push --mirror同步:
bash复制cd kernel.git
git remote set-url origin git@your-git-server:rk3566-sdk/kernel.git
git lfs push --all origin # 特别处理LFS对象
git push --mirror
3.5 重构repo manifest
修改原始manifest文件中的remote地址:
xml复制<remote name="origin" fetch="git@your-git-server:rk3566-sdk" />
将修改后的manifest推送到私有manifest仓库。
4. 关键问题排查与解决
4.1 子模块更新失败
现象:执行repo sync时提示fatal: repository 'xxx' not found
解决方案:
- 检查
.repo/manifests.git中remote地址是否正确 - 确认所有子仓库已完整推送(包括tags)
- 删除.repo/project-objects目录后重试
4.2 Git LFS对象丢失
现象:编译时提示缺失dtb或固件文件
处理步骤:
bash复制# 在每仓库中执行
git lfs install
git lfs fetch --all
git lfs checkout
4.3 仓库体积异常增大
可能原因:未正确迁移LFS文件
补救措施:
bash复制git lfs migrate import --everything --include="*.dtb,*.bin"
git reflog expire --expire=now --all
git gc --prune=now --aggressive
5. 后续维护策略
5.1 同步官方更新
建立上游远程跟踪:
bash复制git remote add upstream git://git.rock-chips.com/rk/rk3566/linux/kernel.git
git fetch upstream
git merge upstream/master
5.2 分支管理建议
推荐的分支结构:
- master:与官方主线保持同步
- dev:团队开发分支
- release/v1.0:版本冻结分支
5.3 自动化同步方案
编写CI脚本定期检查官方更新(示例):
bash复制#!/bin/bash
cd kernel.git
git fetch upstream
if [ $(git rev-list HEAD..upstream/master --count) -gt 0 ]; then
git merge upstream/master
git push origin master
echo "Kernel updated" | mail -s "SDK Sync Alert" team@example.com
fi
6. 深度优化技巧
6.1 仓库瘦身方法
对于历史提交中的大文件:
bash复制git filter-repo --strip-blobs-bigger-than 10M --force
git lfs migrate import --include="*.bin,*.img"
6.2 加速repo sync
修改.repo/manifest.xml:
xml复制<manifest>
<repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />
<remote name="origin" fetch="git@your-git-server" clone-depth="1"/>
</manifest>
6.3 离线开发支持
生成全量代码包:
bash复制repo forall -c 'git bundle create ../${REPO_PROJECT}.bundle --all'
恢复时使用:
bash复制repo init -u /path/to/local/manifests.git
repo sync --no-clone-bundle --use-bundle
整个迁移过程最耗时的环节通常是首次克隆官方仓库,建议在海外服务器上完成镜像后再传输到内网。我曾遇到过一个RK3566 SDK完整克隆需要80GB+磁盘空间的情况,通过LFS优化后最终私有仓库仅占用12GB。记住一定要在迁移完成后运行git fsck检查仓库完整性,这是保证后续开发顺利的关键保障。
