迷你钢切片
66.39M · 2026-02-11
Repo 是 Google 开发的 Python 脚本工具,用于管理多个 Git 仓库。它封装了 Git 命令,让你能够同时操作数百个 Git 仓库,常用于大型项目(如 Android 源码、AOSP)。
# 创建 bin 目录并下载 repo
mkdir -p ~/.bin
curl > ~/.bin/repo
chmod a+rx ~/.bin/repo
# 添加到 PATH
export PATH="${HOME}/.bin:${PATH}"
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 初始化 manifest 仓库
repo init -u <manifest仓库地址> -b <分支名> -m <manifest文件>
# 示例:下载 AOSP 源码
repo init -u -b android-13.0.0_r1
常用参数:
| 参数 | 说明 |
|---|---|
-u | Manifest 仓库 URL(必需) |
-b | 指定分支/版本 |
-m | 指定 manifest XML 文件(默认 default.xml) |
--depth=1 | 浅克隆,只下载最新提交(节省空间) |
--no-clone-bundle | 禁用 clone.bundle(解决某些网络问题) |
# 同步所有仓库代码(首次下载)
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 # 上传并验证
# 在所有仓库执行命令
repo forall -c 'git log --oneline -5'
# 只在有修改的仓库执行
repo forall -c 'git clean -fd'
# 多命令执行
repo forall -c 'git add . && git commit -m "update"'
# 只操作特定路径的项目
repo forall platform/frameworks/base -c 'git status'
# 使用正则表达式
repo forall -r "platform/.*" -c 'git branch'
repo list # 列出所有管理的项目
repo list -p # 显示项目路径
repo manifest # 显示当前 manifest 内容
repo manifest -r -o output.xml # 导出当前所有仓库的精确版本
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 rebase 或 git 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 你的修改
| 场景 | 使用工具 |
|---|---|
| 单仓库操作 | Git |
| 多仓库统一管理 | Repo |
| 查看/提交单个项目 | 进入目录用 Git |
| 批量操作所有项目 | Repo (repo forall) |
| 大型项目(AOSP) | Repo + Manifest |
Repo 本质上是对 Git 的批量封装,掌握 Git 基础后,Repo 的学习曲线会很平缓。建议先熟悉 Git,再使用 Repo 管理复杂的多仓库项目。