如何使用repo工具维护AOSP分支同步及私有修改管理
针对你fork了完整AOSP到私有仓库、同时要定期同步上游更新的需求,以下是基于Repo工具的完整操作流程:
1. 配置Repo清单的双远程仓库
Repo的核心是清单文件,你需要在清单里同时定义上游AOSP和私有仓库两个远程,并为每个代码库指定默认拉取源和推送目标:
编辑清单文件
打开本地Repo清单目录下的default.xml(路径通常是.repo/manifests/default.xml),先添加两个远程配置:
<!-- 上游AOSP远程,用于拉取官方更新 --> <remote name="aosp" fetch="https://android.googlesource.com/" review="android-review.googlesource.com" /> <!-- 私有仓库远程,用于推送你的修改 --> <remote name="private" fetch="ssh://git@你的私有仓库地址前缀/" <!-- 替换为实际地址,比如gitlab.example.com/android/ --> pushurl="ssh://git@你的私有仓库地址前缀/" />
接着,为每个<project>节点指定默认拉取远程为aosp,推送远程为private:
<!-- 示例:frameworks/base库的配置 --> <project path="frameworks/base" name="platform/frameworks/base" remote="aosp" pushremote="private" />
如果是批量修改所有项目,可以用文本编辑器的批量替换功能,给所有<project>节点加上remote="aosp" pushremote="private"属性。
2. 初始化本地开发分支并关联私有仓库
AOSP默认处于分离HEAD状态,你需要创建自己的开发分支,并关联到私有仓库的对应分支:
批量处理所有仓库
用repo forall命令一次性为所有代码库创建并关联分支(以my-dev作为开发分支名为例):
# 创建my-dev分支并切换到该分支,同时关联私有仓库的my-dev分支 repo forall -c 'git checkout -b my-dev; git branch --set-upstream-to=private/my-dev my-dev'
如果是第一次推送,私有仓库还没有对应分支,执行推送时会自动创建。
单个仓库处理(可选)
如果只需要针对特定仓库操作:
cd frameworks/base git checkout -b my-dev git branch --set-upstream-to=private/my-dev my-dev
3. 定期同步上游AOSP更新
因为已经将默认拉取远程设为aosp,直接执行repo sync即可同步所有上游代码:
# -j8 表示用8线程同步,可根据机器性能调整 repo sync -j8
同步完成后,上游的更新会保存在本地的aosp/master分支(或对应版本分支),需要将这些更新合并到你的开发分支:
# 批量合并上游更新到所有仓库的my-dev分支 repo forall -c 'git checkout my-dev; git merge aosp/master'
如果某个仓库出现冲突,需要进入对应目录手动解决冲突后,执行git add .和git commit完成合并。
4. 推送修改到私有仓库
由于已经在清单里指定了pushremote为私有仓库,直接用repo push即可批量推送所有仓库的修改:
# 推送my-dev分支到私有仓库 repo push private my-dev
单个仓库推送的话,直接执行git push即可,因为已经关联了私有仓库的分支。
关键注意事项
- 确保私有仓库的代码库路径与AOSP完全一致,这样清单里的
name属性可以直接复用AOSP的命名,私有仓库的fetch前缀要对应正确。 - Repo工具版本需支持
pushremote属性,建议使用较新版本的Repo。 - 如果需要切换到其他AOSP版本分支,只需修改清单里的
<default>节点的revision属性,再执行repo sync即可。
内容的提问来源于stack exchange,提问作者artem

