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%是配置问题。我整理了一个排查清单:

  1. 网络超时:检查代理设置,或者换镜像源。
  2. SSL证书错误:尝试 export GIT_SSL_NO_VERIFY=1(不推荐生产环境使用)。
  3. 磁盘空间不足:OpenHarmony 完整源码约 20GB,确保有 50GB 以上空闲空间。
  4. 清单文件错误:repo init 时指定的分支或Tag不存在。
  5. Git版本过低:要求 Git 2.17 以上,建议升级到最新版。
快速诊断命令:
repo sync -j1 --trace 2>&1 | grep "fatal\|error\|timeout"
这个命令会以单线程模式运行,并打印详细的错误日志,方便定位问题。

2.5 核心流程:一张图看懂

下面这张SVG图,展示了从 repo init 到 repo sync 的完整流程,以及常见的失败点:

repo init & repo sync 核心流程 repo init & repo sync 核心流程 repo init 下载 manifest.xml 检查分支/Tag repo sync 并行下载仓库 完成 失败:网络超时/SSL错误 失败:分支/Tag不存在 失败:磁盘空间不足

2.6 我的个人经验总结

做了这么多年嵌入式,我总结了几条关于源码下载的铁律:

  • 先看清单,再动手:repo init 后,务必检查 .repo/manifest.xml 里的 <default revision>。
  • 网络不行,别硬扛:换个时间段,或者用代理/镜像,比反复重试效率高得多。
  • 磁盘空间,留足余量:源码20GB,编译产物可能再占30GB,建议准备100GB以上。
  • 善用 --trace:遇到莫名其妙的失败,加 --trace 参数,看详细日志,比瞎猜强百倍。

嗯,源码下载这部分就到这里。记住,这一步稳了,后面的编译和烧录才能顺利。别急,慢慢来。