什么是 Repo?

Repo 是 Google 开发的 Python 脚本工具,用于管理多个 Git 仓库。它封装了 Git 命令,让你能够同时操作数百个 Git 仓库,常用于大型项目(如 Android 源码、AOSP)。


一、安装 Repo

1. 下载 Repo 工具

# 创建 bin 目录并下载 repo
mkdir -p ~/.bin
curl  > ~/.bin/repo
chmod a+rx ~/.bin/repo

# 添加到 PATH
export PATH="${HOME}/.bin:${PATH}"

2. 配置 Git 基本信息(必需)

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

二、基础工作流程

1. 初始化仓库(repo init)

# 初始化 manifest 仓库
repo init -u <manifest仓库地址> -b <分支名> -m <manifest文件>

# 示例:下载 AOSP 源码
repo init -u  -b android-13.0.0_r1

常用参数:

参数说明
-uManifest 仓库 URL(必需)
-b指定分支/版本
-m指定 manifest XML 文件(默认 default.xml)
--depth=1浅克隆,只下载最新提交(节省空间)
--no-clone-bundle禁用 clone.bundle(解决某些网络问题)

2. 同步代码(repo sync)

# 同步所有仓库代码(首次下载)
repo sync

# 常用参数
repo sync -c          # 只同步当前分支,不下载其他分支
repo sync -j8         # 使用 8 线程并行下载
repo sync -f          # 失败时继续同步其他项目
repo sync --no-tags   # 不下载标签,减少数据量
repo sync -d          # 切换到 manifest 指定的版本(放弃本地修改)

三、日常开发命令

仓库状态管理

repo status           # 查看所有仓库的修改状态
repo diff             # 查看所有未提交的修改
repo forall -c 'git status'   # 在所有仓库执行 git status

分支操作

repo start <分支名> --all      # 在所有仓库创建新分支
repo start <分支名> <项目名>    # 在指定项目创建分支
repo abandon <分支名>          # 删除所有仓库的指定分支
repo checkout <分支名>         # 切换到指定分支

提交代码

repo upload             # 提交代码到 Gerrit 代码审查(AOSP 工作流)
repo upload --cbr       # 上传当前分支
repo upload --verify    # 上传并验证

四、高级用法

1. 批量执行命令(forall)

# 在所有仓库执行命令
repo forall -c 'git log --oneline -5'

# 只在有修改的仓库执行
repo forall -c 'git clean -fd'

# 多命令执行
repo forall -c 'git add . && git commit -m "update"'

2. 筛选特定项目

# 只操作特定路径的项目
repo forall platform/frameworks/base -c 'git status'

# 使用正则表达式
repo forall -r "platform/.*" -c 'git branch'

3. 查看仓库信息

repo list             # 列出所有管理的项目
repo list -p          # 显示项目路径
repo manifest         # 显示当前 manifest 内容
repo manifest -r -o output.xml   # 导出当前所有仓库的精确版本

五、Manifest 文件解析

Manifest 是 XML 文件,定义了项目结构和仓库映射:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <!-- 远程仓库配置 -->
    <remote name="origin" fetch="https://github.com/example/" />
    
    <!-- 默认配置 -->
    <default remote="origin" revision="main" sync-j="4" />
    
    <!-- 项目定义 -->
    <project path="framework" name="framework" groups="core" />
    <project path="app" name="myapp" revision="develop" />
    <project path="docs" name="documentation" clone-depth="1" />
    
    <!-- 包含其他 manifest -->
    <include name="vendor.xml" />
</manifest>

关键标签:

  • <remote>:定义远程仓库地址
  • <project>:定义具体项目,path 是本地目录,name 是远程仓库名
  • <groups>:项目分组,可用 repo sync -g core 只同步特定组

六、常见问题解决

问题解决方案
同步失败/卡住repo sync -f -j1 单线程重试,或检查网络
权限不足配置 SSH Key 或使用 repo init 的 HTTPS 地址
磁盘空间不足使用 --depth=1 浅克隆,或 repo sync -c
冲突解决进入具体项目目录,手动 git rebasegit merge
放弃所有本地修改repo forall -c 'git reset --hard HEAD && git clean -fd'
更新 repo 工具本身repo selfupdate 或重新下载

七、典型工作流示例

# 1. 初始化 Android 源码仓库
repo init -u  -b master --partial-clone --clone-filter=blob:limit=10M

# 2. 同步代码(可能需要数小时)
repo sync -c -j8

# 3. 创建开发分支
repo start my-feature --all

# 4. 修改代码后查看状态
repo status
repo diff

# 5. 提交修改(AOSP 流程)
repo upload

# 6. 同步最新代码
repo sync  # 会自动 rebase 你的修改

总结对比:Repo vs Git

场景使用工具
单仓库操作Git
多仓库统一管理Repo
查看/提交单个项目进入目录用 Git
批量操作所有项目Repo (repo forall)
大型项目(AOSP)Repo + Manifest

Repo 本质上是对 Git 的批量封装,掌握 Git 基础后,Repo 的学习曲线会很平缓。建议先熟悉 Git,再使用 Repo 管理复杂的多仓库项目。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com