Repo 常用操作手册
最近Android开发源码使用repo管理了;
之前的系统源码也是repo下载的,但是实际整个源码在同一个Git仓库;
现在开发的源码repo下载后,整个源码是有十几个Git仓库;
不同的仓库目录,不能相互查看记录非常麻烦。。。
要cd到某个文件的仓库目录才能查看和上库;
分布式管理看起来比较麻烦,但是说是有利于移植。
只能学习repo一些具体的命令了。有需要的可以收藏看看。
文章目录
- [Repo 常用操作手册](#Repo 常用操作手册)
-
- [1. 基础说明](#1. 基础说明)
-
- [1.1 安装配置repo工具](#1.1 安装配置repo工具)
- [1.2 配置Git环境](#1.2 配置Git环境)
- [2. 源码拉取与同步](#2. 源码拉取与同步)
-
- [2.1 初始化仓库](#2.1 初始化仓库)
- [2.2 同步代码 repo sync](#2.2 同步代码 repo sync)
- [3. 分支管理](#3. 分支管理)
-
- [3.1 创建本地开发分支 repo start](#3.1 创建本地开发分支 repo start)
- [3.2 删除本地分支 repo abandon](#3.2 删除本地分支 repo abandon)
- [3.3 查看分支信息 repo branches](#3.3 查看分支信息 repo branches)
- [4. 查看仓库、分支、基线信息](#4. 查看仓库、分支、基线信息)
-
- [4.1 列出所有子仓库 repo list](#4.1 列出所有子仓库 repo list)
- [4.2 导出 / 查看当前生效清单 repo manifest](#4.2 导出 / 查看当前生效清单 repo manifest)
- [4.3 单仓库详细信息 repo info](#4.3 单仓库详细信息 repo info)
- [4.4 批量查询真实当前分支(最准)](#4.4 批量查询真实当前分支(最准))
- [4.5 全局对比本地代码与基线差异](#4.5 全局对比本地代码与基线差异)
- [5. 批量执行 Git 命令 repo forall](#5. 批量执行 Git 命令 repo forall)
- [6. 代码提交上传(Gerrit 平台)](#6. 代码提交上传(Gerrit 平台))
- [7. 检索、辅助工具命令](#7. 检索、辅助工具命令)
- [8. 高频场景组合命令](#8. 高频场景组合命令)
- [9. 易踩坑区分点](#9. 易踩坑区分点)
- [10、repo manifest 查看所有仓库和对应信息:](#10、repo manifest 查看所有仓库和对应信息:)
- 附录:Repo与Git行业使用区分&未来趋势
1. 基础说明
- Repo:基于 Git 的多仓库管理工具,多用于 Android/AOSP 大项目,依靠 manifest.xml 统一管理大量独立 Git 子仓
- 底层所有代码操作均依赖 Git,Repo 仅做批量调度
不用配置的,直接看后面的命令就行。
1.1 安装配置repo工具
一般需要管理员进行安装配置
# 创建 bin 目录并添加到 PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH
# 下载 Repo 工具
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 验证repo版本(显示版本信息即为正常,若报错需检查路径配置)
repo --version
# 若repo版本过旧,执行升级:repo selfupdate
注意:Python环境:Repo工具依赖Python 3,检查Python版本(python --version),确保为3.x版本,若为2.x版本需切换至Python 3。
1.2 配置Git环境
# 全局配置Git账号(填写自己的DevOps账号信息,与平台账号一致)
git config --global user.name "你的DevOps用户名"
git config --global user.email "你的DevOps邮箱"
git config --global core.longpaths true # 解决安卓16源码长路径文件报错
git config --global push.default matching
git config --global credential.helper store # 缓存凭据,避免重复输入账号密码
# 验证Git配置(无报错即为正常,确认user.name和user.email正确)
git config --list
2. 源码拉取与同步
2.1 初始化仓库
# 基础初始化:清单地址 + 清单分支
repo init -u git@xxx/manifest.git -b master
# 指定自定义清单文件
repo init -u git@xxx/manifest.git -b rk3588 -m rk3588.xml
# 只拉取指定分组模块,减少下载体积
repo init -u git@xxx/manifest.git -b android14 -g platform,device
参数说明:
-u:manifest 远程仓库地址-b:manifest 仓库分支-m:指定 xml 清单文件,默认 default.xml-g:过滤拉取分组 project
2.2 同步代码 repo sync
# 多线程完整同步(推荐)
repo sync -j16
# 同步并强制切回 manifest 基线(detach 游离头)
repo sync -d -j16
# 仅同步单个模块
repo sync release/bootloader
# 强制覆盖本地冲突文件
repo sync -f
# 仅拉取当前分支,不获取全部分支,提速
repo sync -c -j16
重点参数释义:
-d / --detach:所有仓库脱离本地开发分支,强制切到清单指定基线版本,进入游离 HEAD,常用于基线编译复位-j:多线程并发下载-f:文件冲突时强制覆盖,慎用(丢失本地未提交修改)
3. 分支管理
3.1 创建本地开发分支 repo start
# 全部子仓新建同一分支
repo start fn_master_preview --all
# 仅单个模块创建分支
repo start fn_master_preview release/bootloader
3.2 删除本地分支 repo abandon
# 所有仓库删除分支
repo abandon fn_master_preview --all
# 仅删除单个模块分支
repo abandon fn_master_preview release/bootloader
3.3 查看分支信息 repo branches
# 查看所有通过 repo start 创建的分支及归属仓库
repo branches
# 简洁模式,展示变更信息
repo branches -v
关键输出规则:
分支名 | in xxx:xxx 仓库存在该 repo 创建的分支分支名 | not in xxx:xxx 仓库未创建该分支- 该命令仅记录 repo start 创建的分支,无法反映手动 git checkout 后的实时当前分支
4. 查看仓库、分支、基线信息
4.1 列出所有子仓库 repo list
# 完整输出:仓库路径 + 远程地址
repo list
# 仅输出仓库路径
repo list -p
# 过滤指定模块
repo list | grep release/packages
4.2 导出 / 查看当前生效清单 repo manifest
# 控制台打印当前 manifest 内容
repo manifest //这个比较实用,可以查看当前所有仓库和仓库对应的分支名称
# 导出清单到本地文件
repo manifest -o current_manifest.xml
4.3 单仓库详细信息 repo info
repo info release/bootloader
输出包含:当前分支、manifest 基线版本、远程跟踪分支
4.4 批量查询真实当前分支(最准)
# 批量打印每个仓库实时检出分支
repo forall -p -c "git rev-parse --abbrev-ref HEAD"
# 返回 HEAD 代表当前处于 detached 游离状态
4.5 全局对比本地代码与基线差异
repo diff
5. 批量执行 Git 命令 repo forall
统一批量操作所有 / 部分子仓库,-p 打印仓库路径区分输出
# 1. 批量查看仓库状态
repo forall -p -c "git status"
# 2. 批量查看最近10条提交日志
repo forall -p -c "git log --oneline -10"
# 3. 批量拉取远程更新
repo forall -c "git fetch origin"
# 4. 批量切换分支
repo forall -c "git checkout master"
# 5. 批量丢弃本地未提交修改(谨慎执行)
repo forall -c "git reset --hard HEAD && git clean -df"
# 6. 仅对指定分组批量执行
repo forall -g skg -p -c "git log --oneline"
# 7. 仅单个模块执行git命令
repo forall release/common -p -c "git branch"
6. 代码提交上传(Gerrit 平台)
# 交互式暂存所有变更
repo stage -i
# 上传当前分支提交到gerrit
repo upload
# 指定上传目标分支
repo upload --branch release
上面这些repo上库命令没用过。
7. 检索、辅助工具命令
# 全局所有仓库检索文件关键词
repo grep "TARGET_PRODUCT"
# 查看 repo 工具版本
repo --version
8. 高频场景组合命令
-
全新拉取完整代码
repo init -u git@xxx/manifest.git -b master && repo sync -j16
-
同步并复位到基线版本编译
repo sync -d -j16
-
全局新建开发分支
repo start fn_master_preview --all
-
批量查看所有仓库真实当前分支
repo forall -p -c "git rev-parse --abbrev-ref HEAD"
-
一键清空所有本地未提交改动
repo forall -c "git reset --hard HEAD && git clean -df"
9. 易踩坑区分点
repo branches只记录 repo start 创建的分支归属,不能反映手动 git checkout 后的真实当前分支;repo sync -d会强制切游离头,本地未提交修改会被覆盖,操作前务必 commit /stash;- 跨仓库合并 commit 不能用 repo,需进入单个子仓使用 git cherry-pick /git merge;
- detached HEAD 游离状态下提交的 commit 无分支引用,容易丢失,开发前需 repo start 创建分支。
10、repo manifest 查看所有仓库和对应信息:
release/vendor/ebsw$ git branch
* master
release/vendor/ebsw$ repo manifest
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="ssh://devops.ktc.cn:30022/ktc/RD-50/IFPD/" name="origin"/>
<default remote="origin" sync-j="8"/>
<project name="ALLin-OS/OS_DEV/Apps/SkgArtifactApps" path="release/packages/skg/SkgArtifactApps" revision="master"/>
<project name="ALLin-OS/OS_DEV/Apps/SkgArtifactSystem" path="release/packages/skg/SkgArtifactSystem" revision="master"/>
<project name="ALLin-OS/OS_DEV/MiddleWare/SkgFramework" path="release/packages/skg/SkgFramework" revision="master"/>
<project name="ALLin-OS/OS_DEV/MiddleWare/SkgSystemApp" path="release/packages/skg/SkgSystemApp" revision="master"/>
<project name="ALLin-OS/ebsw/sy-allinos-ebsw-native-api-ifpd" path="release/packages/ebsw" revision="master"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-AIDL-EDLA-IFPD" path="release/vendor/ebsw" revision="master"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-bootloader-EDLA-IFPD" path="release/bootloader" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-common-EDLA-IFPD" path="release" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-common-drivers-IFPD" path="release/common/common16-6.12/common_drivers" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-common16-6.12-common-IFPD" path="release/common/common16-6.12/common" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-custom-IFPD" path="release/custom" revision="master"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-device-IFPD" path="release/device" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-device-amlogic-common-IFP" path="release/device/amlogic/common" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-driver-modules-IFPD" path="release/common/driver_modules" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-frameworks-EDLA-IFPD" path="release/frameworks" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-hardware-EDLA-IFPD" path="release/hardware" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-hardware-amlogic-IFPD" path="release/hardware/amlogic" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-kernel-EDLA-IFPD" path="release/common" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-vendor-EDLA-IFPD" path="release/vendor" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3-AN16-vendor-amlogic-common-IFP" path="release/vendor/amlogic/common" revision="fn_master_preview"/>
<project name="AML/A311Y3/AN16_OS/SY-A311Y3AN16-hardware-amlogic-audio-IFP" path="release/hardware/amlogic/audio" revision="fn_master_preview"/>
</manifest>
release/vendor/ebsw$ cd ..
release/vendor$ git branch
* fn_master_preview
master
release/vendor$ cd ..
release$ git branch
* fn_master_preview
master
release$
图片看比较清楚:

附录:Repo与Git行业使用区分&未来趋势
(1)底层关系
Git是分布式版本控制底层标准,Repo是基于Git开发的多仓库批量管理工具,不能脱离Git独立运行。
(2)分场景主流选型
场景1:Android/AOSP衍生固件(电视、车机、机顶盒、手机)
- 主流方案:Repo + Git(行业永久标配,2026及后续无替代方案)
- 适用:项目拆分几十~上百个独立Git子仓,需要统一基线批量同步、Gerrit批量提交
场景2:标准嵌入式Linux(Yocto/Buildroot/openEuler)、单模块驱动/APP
- 主流方案:纯原生Git,不使用Repo
- 适用:整套系统为单一Git仓库,仅少量第三方依赖用git submodule管理
场景3:互联网后端、桌面软件、小型工具
- 主流方案:纯Git + Git Submodule,无Repo使用场景
(3) 长期发展结论
- Git是所有源码管理的底层基础,不会被任何工具替代;
- Repo仅限定Android生态巨型分仓项目使用,该领域未来持续主流;
- 中小型Linux、应用开发只会使用原生Git,Repo不会普及;
- Repo仅做批量封装,所有代码提交、分支合并、日志查询底层逻辑均为Git命令。