repo介绍

Android 使用 Git 作为代码管理工具, 开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理, 
还开发了 Repo 命令行工具,对 Git 部分命令封装,将百多个 Git 库有效的进行组织.

源代码标记和细分版本

https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds

使用国内源

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

建立本地镜像

repo init -u git://mirrors.ustc.edu.cn/aosp/mirror/manifest --mirror
repo sync
/usr/bin/git daemon --verbose --export-all --base-path=/mnt /mnt/mirror-aosp

初始化repo

repo init -u git://127.0.0.1/mirror-aosp/platform/manifest
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r1

下载代码

repo sync

查看全部版本

cd .repo/manifests
git branch --all

查看分支

repo branch

创建并切换分支

repo init -b android-8.0.0_r23
repo start android-8.0.0_r23 --all

切换分支

对 git checkout 的封装,但不能带-b参数,所以不能用此命令来创建特性分支
repo checkout android-8.0.0_r23

查看工作区文件差异

git diff 的封装,用于分别显示各个项目工作区下的文件差异
repo diff                                 ---查看所有项目
repo diff platform/build platform/bionic  ---只查看其中两个项目

把文件添加到index表中

对 git add --interactive 的封装, 用于挑选各个项目工作区中的改动以加入暂存区
repo stage -i [<project>…]
    -i 代表 git add --interactive 命令中的 --interactive, 给出个界面供用户选择

删除已经合并分支

对 git branch –d 的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支
repo prune [<project>…]

删除指定分支

对git branch –D 的封装
repo abandon <branchname> [<project>…]

查看文件状态

repo status
对 git diff-index, git diff-filse 的封装, 同时显示暂存区的状态和本地文件修改的状态
每个小节的首行显示羡慕名称,以及所在分支的名称,

第一个字母表示暂存区的文件修改状态
    -:没有改变
    A:添加(不在HEAD中,在暂存区中)
    M:修改(在HEAD中,在暂存区中,内容不同)
    D:删除(在HEAD中,不在暂存区)
    R:重命名(不在HEAD中,在暂存区,路径修改)
    C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)
    T:文件状态改变(在HEAD中,在暂存区,内容相同)
    U:未合并,需要冲突解决

第二个字母表示工作区文件的更改状态
    -:新/未知(不在暂存区,在工作区)
    m:修改(在暂存区,在工作区,被修改)
    d:删除(在暂存区,不在工作区)

两个表示状态的字母后面,显示文件名信息。如果有文件重名还会显示改变前后的文件名及文件的相似度

设置远程仓库

这个指令是根据xml文件添加的远程分支, 方便于向服务器提交代码, 执行之后的build目录下看到新的远程分支org
repo remote add <remotename>  <url> [<project>…]
repo remote rm <remotename>  [<project>…]

向服务器提交代码

repo push <remotename> [--all |<project>…]
repo会自己查询需要向服务器提交的项目并提示用户.

repo forall

repo forall [<project>…] –c <command>
迭代器,可以在所有指定的项目中执行同一个shell指令
Options:
    -c:后面所带的参数着是shell指令
    -p:在shell指令输出之前列出项目名称
    -v:列出执行shell指令输出的错误信息

additional environment variables:
    REPO_PROJECT:指定项目的名称
    REPO_PATH:指定项目在工作区的相对路径
    REPO_REMOTE:指定项目远程仓库的名称
    REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
    REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性

如果-c后面所带的shell指令中有上述环境变量,则需要用单引号把shell指令括起来.
    repo forall –c 'echo $REPO_PROJECT'

清除所有修改及更新命令

repo forall -c "pwd;git clean -f;git checkout -f";repo sync -c --no-tags;repo sync -l;

merge(合并多个分支)

把所有项目多切换到master分支,执行以下指令将topic分支合并到master分支
repo forall –p –c git merge topic

tag(打标签)

在所有项目下打标签
repo forall –c git tag crane-stable-1.6

remote (设置远程仓库)

引用环境变量REPO_PROJECT添加远程仓库:
repo forall –c ‘git remote add korg ssh://[email protected]/$REPO_PROJECT.git’

删除远程仓库:

repo forall –c git remote add korg

branch(创建特性分支)

repo forall –c git branch crane-dev
repo forall –c git checkout –b crane-dev

repo的额外命令集

repo grep

对 git grep 的封装,用于在项目文件中进行内容查找

显示manifest文件内容

repo manifest –o android.xml

显示repo的版本号

repo version

repo upload

repo upload相当于git push,但是又有很大的不同,它不是将版本库改动推送到克隆时的远程服务器,
而是推送到代码审核服务器(Gerrit软件架设)的特殊引用上,使用SSH协议.
代码审核服务器会对推送的提交进行特殊处理,将新的提交显示为一个待审核的修改集,并进入代码审查流程,
只有当审核通过后,才会合并到官方正式的版本库中.

repo upload [--re --cc] {[<project>]… | --replace <project>}
 Options:
    -h, --help:显示帮助信息
    -t:发送本地分支名称到Gerrit代码审核服务器
    --replace:发送此分支的更新补丁集
    --re=REVIEWERS:要求指定的人员进行审核
    --cc=CC:同时发送通知到如下邮件地址

repo download

主要用于代码审核者下载和评估贡献者提交的修订
repo download {project change [patchset]}…

repo selfupdate

用于repo自身的更新

参考:

https://blog.csdn.net/sunweizhong1024/article/details/8987494