一、基础更新命令
1. 标准更新(repo sync)
# 更新所有仓库到最新代码
repo sync
# 常用参数组合(推荐)
repo sync -c -j8
参数说明:
| 参数 | 作用 |
|---|---|
-c / --current-branch | 只同步当前分支,不下载其他分支(节省时间和空间) |
-j8 | 8 线程并行下载(根据 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。