2. 源码下载:repo init与repo sync详解
源码下载,是进入OpenHarmony开发的第一道门槛。别看它只是敲几行命令,我见过太多人在这一步卡上好几天。说白了,repo 工具就是Google为Android(以及现在的OpenHarmony)定制的Git管理套件,它帮你一次性拉取上百个Git仓库。
嗯,咱们直接进入正题。
2.1 repo init:初始化你的工作目录
repo init 的作用,是在本地创建一个 .repo 目录,并从远程服务器下载清单文件(manifest)。这个清单文件,说白了就是一张“购物清单”,告诉 repo 需要拉取哪些仓库、每个仓库在哪个分支、对应哪个Tag。
基本用法:
mkdir ohos_workspace
cd ohos_workspace
repo init -u https://gitee.com/openharmony/manifest.git -b master
这里 -u 指定清单仓库的URL,-b 指定分支。我个人习惯在 repo init 之后,先看一眼 .repo/manifest.xml,确认清单内容是否正确。
https:// 换成 git:// 协议,或者使用镜像站(如 https://mirrors.ustc.edu.cn/openharmony/manifest.git),速度能快不少。
2.2 指定分支与Tag:精准定位代码版本
OpenHarmony 的版本迭代很快。你想想看,如果拉错了分支,编译时各种接口对不上,那才叫头疼。
指定分支:
repo init -u <manifest-url> -b refs/tags/OpenHarmony-v3.2-Release
指定Tag:
repo init -u <manifest-url> -b refs/tags/OpenHarmony-v3.2-Release
注意:-b 参数既可以接分支名,也可以接Tag的完整引用路径。我建议你优先使用Tag,因为Tag是固定的,不会变。分支可能会被强制推送,导致本地与远程不一致。
| 参数 | 说明 | 示例 |
|---|---|---|
-b master |
拉取master分支最新代码 | 适合日常开发 |
-b refs/tags/v3.2-Release |
拉取指定发布Tag | 适合稳定构建 |
-m default.xml |
指定清单文件 | 多清单项目必用 |
repo init 之后直接 repo sync 就跑开不管。先检查 .repo/manifest.xml 里的 <default revision> 是否是你想要的分支或Tag。我曾经因为清单文件指向了错误的分支,白白浪费了3个小时下载了300多个仓库。
2.3 repo sync:断点续传与并行下载
repo sync 是真正的下载环节。它会根据清单文件,逐个拉取所有仓库的代码。默认情况下,repo 会使用4个并行任务下载。你可以通过 -j 参数调整并行数。
我个人建议:
- 网络好的时候,用
-j8或-j16,速度翻倍。 - 网络不稳定的时候,用
-j4,减少失败概率。
断点续传是 repo 自带的特性。如果某个仓库下载失败,重新执行 repo sync 会从断点继续,不会从头开始。但这里有个坑:
我曾经遇到过的情况: 某个仓库下载到90%时网络断了,重新 repo sync 后,它居然重新从0%开始下载。后来发现,是因为那个仓库的 .git/objects 目录被部分写入,导致repo认为本地仓库已损坏,于是决定重新克隆。
解决办法: 先删除那个仓库的目录(在 .repo/projects/ 下找到对应仓库),再重新 repo sync。
断点续传的常用命令组合:
# 第一次同步
repo sync -j8
# 如果中途失败,重新执行(会自动续传)
repo sync -j4
# 只同步失败的仓库(跳过已成功的)
repo sync --fail-fast -j4
2.4 下载失败常见原因与排查
下载失败,90%的情况是网络问题。但还有10%是配置问题。我整理了一个排查清单:
- 网络超时:检查代理设置,或者换镜像源。
- SSL证书错误:尝试
export GIT_SSL_NO_VERIFY=1(不推荐生产环境使用)。 - 磁盘空间不足:OpenHarmony 完整源码约 20GB,确保有 50GB 以上空闲空间。
- 清单文件错误:
repo init时指定的分支或Tag不存在。 - Git版本过低:要求 Git 2.17 以上,建议升级到最新版。
repo sync -j1 --trace 2>&1 | grep "fatal\|error\|timeout"这个命令会以单线程模式运行,并打印详细的错误日志,方便定位问题。
2.5 核心流程:一张图看懂
下面这张SVG图,展示了从 repo init 到 repo sync 的完整流程,以及常见的失败点:
2.6 我的个人经验总结
做了这么多年嵌入式,我总结了几条关于源码下载的铁律:
- 先看清单,再动手:
repo init后,务必检查.repo/manifest.xml里的<default revision>。 - 网络不行,别硬扛:换个时间段,或者用代理/镜像,比反复重试效率高得多。
- 磁盘空间,留足余量:源码20GB,编译产物可能再占30GB,建议准备100GB以上。
- 善用
--trace:遇到莫名其妙的失败,加--trace参数,看详细日志,比瞎猜强百倍。
嗯,源码下载这部分就到这里。记住,这一步稳了,后面的编译和烧录才能顺利。别急,慢慢来。