repo 更新代码

2 阅读4分钟

一、基础更新命令

1. 标准更新(repo sync)

# 更新所有仓库到最新代码
repo sync

# 常用参数组合(推荐)
repo sync -c -j8

参数说明:

参数作用
-c / --current-branch只同步当前分支,不下载其他分支(节省时间和空间
-j88 线程并行下载(根据 CPU 调整)
-f / --force-broken某个项目失败时继续同步其他项目
-d / --detach切换到 manifest 指定版本(丢弃本地分支修改
--no-tags不下载标签,减少数据量
-q / --quiet静默模式,减少输出
---

## 二、不同场景的更新策略

### 场景 1:保留本地修改,同步最新代码
```bash
# 默认行为:会尝试 rebase 本地提交到最新远程代码
repo sync

# 如果冲突,进入对应目录手动解决
cd <冲突项目>
git status                    # 查看冲突文件
# 手动编辑解决冲突后
git add .
git rebase --continue

场景 2:完全放弃本地修改,强制同步远程

# 危险操作!会丢失所有未提交的本地修改
repo sync -d

# 或者更彻底:重置所有仓库
repo forall -c 'git reset --hard HEAD && git clean -fd'
repo sync

场景 3:只更新特定项目

# 更新单个项目
repo sync platform/frameworks/base

# 更新多个指定项目
repo sync project1 project2 project3

场景 4:更新到特定版本/标签

# 先更新 manifest 到指定分支
repo init -b android-13.0.0_r1   # 切换到新分支
repo sync                        # 同步新分支代码

三、更新工作流程详解

完整更新流程(推荐)

# 1. 查看当前状态(确认有无本地修改)
repo status

# 2. 如果有修改,先暂存或提交
repo diff              # 查看修改内容
# 选择 A:提交到本地分支
repo forall -c 'git add . && git commit -m "WIP: local changes"'
# 选择 B:暂存到 stash
repo forall -c 'git stash push -m "temp"'

# 3. 执行更新
repo sync -c -j8 -f

# 4. 恢复之前的修改(如果使用了 stash)
repo forall -c 'git stash pop'

# 5. 验证更新结果
repo manifest -r -o current.xml    # 导出当前版本快照

四、处理更新冲突

冲突解决步骤

# 1. 更新时提示冲突,先查看哪些项目冲突
repo status   # 显示冲突的项目路径

# 2. 进入冲突项目目录
cd .repo/projects/xxx/xxx   # 或直接进入项目目录

# 3. 查看冲突详情
git status
git diff

# 4. 解决冲突(编辑冲突文件)

# 5. 标记解决并继续
git add <冲突文件>
git rebase --continue    # 如果是 rebase 冲突
# 或
git merge --continue     # 如果是 merge 冲突

# 6. 返回根目录继续其他项目
cd ../../..

批量放弃冲突(谨慎使用)

# 放弃所有 rebase/merge 状态,回到更新前
repo forall -c 'git rebase --abort 2>/dev/null || git merge --abort 2>/dev/null || true'

五、高级更新技巧

1. 增量更新(只下载最新提交)

# 首次克隆时使用浅克隆
repo init --depth=1 ...
repo sync

# 后续更新(保持浅克隆)
repo sync --depth=1 -c

2. 后台更新 + 断点续传

# 使用 tmux/screen 防止 SSH 断开
tmux new -s repo-sync
repo sync -c -j8

# 如果断开,重新连接后
tmux attach -t repo-sync

3. 网络不稳定时的更新

# 自动重试直到成功
while ! repo sync -c -j4 -f; do
    echo "Sync failed, retrying in 10 seconds..."
    sleep 10
done

4. 更新后清理空间

# 清理所有仓库的孤儿对象
repo forall -c 'git gc --prune=now'

# 删除不再引用的远程分支
repo forall -c 'git remote prune origin'

六、Manifest 更新(切换版本)

# 1. 查看当前 manifest 分支
cat .repo/manifests.git/config | grep branch

# 2. 切换到新分支/版本
repo init -b android-14.0.0_r1   # 切换到 Android 14
repo sync -c -j8                 # 同步新分支代码

# 3. 或者只更新 manifest 本身(不立即同步代码)
repo init -b main --no-clone-bundle
# 然后手动决定何时 sync

七、快速参考表

需求命令
快速更新(日常)repo sync -c -j8
强制同步远程(放弃本地)repo sync -d
更新特定项目repo sync <项目名>
网络差时更新repo sync -f -j1
查看更新前后差异repo diff
保存当前版本快照repo manifest -r -o snap.xml
回滚到快照版本repo init -m snap.xml && repo sync -d

八、常见问题

Q: repo sync 卡住不动?

# 检查网络连接,或尝试单线程
repo sync -j1 -f

# 清除缓存重试
rm -rf .repo/repo/projects.list
repo sync

Q: 更新后编译失败?

# 可能是 manifest 更新了依赖关系
repo sync -c -d        # 强制完全同步
# 然后执行项目的清理脚本(如 Android 的)
make clean

Q: 如何只更新 manifest 不下载代码?

repo init -b <新分支>  # 只更新 manifest 引用
# 此时不执行 repo sync,代码保持不变

掌握这些命令后,你可以根据网络状况、本地修改情况灵活选择更新策略。日常开发最常用的是 repo sync -c -j8