Repo 多git仓库管理工具

什么是 Repo?

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


一、安装 Repo

1. 下载 Repo 工具

bash 复制代码
# 创建 bin 目录并下载 repo
mkdir -p ~/.bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+rx ~/.bin/repo

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

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

bash 复制代码
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

二、基础工作流程

1. 初始化仓库(repo init)

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

# 示例:下载 AOSP 源码
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r1

常用参数:

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

2. 同步代码(repo sync)

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

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

三、日常开发命令

仓库状态管理

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

分支操作

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

提交代码

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

四、高级用法

1. 批量执行命令(forall)

bash 复制代码
# 在所有仓库执行命令
repo forall -c 'git log --oneline -5'

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

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

2. 筛选特定项目

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

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

3. 查看仓库信息

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

五、Manifest 文件解析

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

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 或重新下载

七、典型工作流示例

bash 复制代码
# 1. 初始化 Android 源码仓库
repo init -u https://android.googlesource.com/platform/manifest -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 管理复杂的多仓库项目。

相关推荐
寻寻觅觅☆14 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc14 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
ceclar12315 小时前
C++使用format
开发语言·c++·算法
lanhuazui1016 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee4416 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
老约家的可汗16 小时前
初识C++
开发语言·c++
crescent_悦16 小时前
C++:Product of Polynomials
开发语言·c++
小坏坏的大世界17 小时前
CMakeList.txt模板与 Visual Studio IDE 操作对比表
c++·visual studio
乐观勇敢坚强的老彭17 小时前
c++寒假营day03
java·开发语言·c++
愚者游世18 小时前
brace-or-equal initializers(花括号或等号初始化器)各版本异同
开发语言·c++·程序人生·面试·visual studio