之前已经讲了Repo的基本理解,这里总结一下Repo的常用命令。
1. repo init
repo init -u manifest_git_path -m manifest_file_name -b branch_name --repo-url=repo_url --no-repo-verify
在当前目录下安装 Repo。这会产生一个 .repo/ 目录,目录包括装 Repo 源代码和标准 Android 清单文件的 Git 仓库。.repo/ 目录还包括 manifest.xml,是一个在 .repo/manifests/ 目录选择清单的符号链接。
选项:
-u: 指定Manifest库的Git访问路径。
-m: 指定要使用的Manifest文件。
-b: 指定要使用Manifest仓库中的某个特定分支。
–repo-url: 指定要检查repo是否有更新的远端repoGit库的访问路径。
–no-repo-verify: 指定不检查repo库是否需要更新。
2. repo sync
repo sync [project_name]
用于参照清单文件克隆并同步版本库。可以使用repo sync project_name的形式只克隆某个项目。。
实现参照清单.repo/manifests.xml克隆并同步版本库,如果版本库不存在,则相当于执行
git clone
如果版本库已经存在,则相当于执行
#对每个remote源进行fetch操作
git remote update
#针对当前分支的跟踪分支进行rebase操作
git rebase/origin/branch
选项:
-d:切换指定项目回到清单修正。如果该项目目前是一个主题分*就有帮助,但清单修正是暂时需要。
-s:同步到一个已知的构建 manifest-server 在当前清单指定的元素。
-f:继续同步其他项目,即使有项目同步失败。
3. repo start
repo start <newbranchname> [--all|<project>...]
创建并切换分支。刚克隆下来的代码是没有分支的,repo start实际是对git checkout -b命令的封装。
为指定的项目或所有的项目(若使用-all),以清单文件中为设定的分支,创建特定的分支。
这条指令与git checkout -b 还是有很大区别的。
· git checkout -b 是在当前所在的分支的基础上创建特性分支。
· 而repo start 是在清单文件设定的分支的基础上创建特性分支。
repo start stable --all
假设清单文件中设定的分支是gingerbread-exdroid-stable,那么执行以上指令就是对所有项目,在gingerbread-exdroid-stable的基础上创建特性分支stable。
repo start stable platform/build platform/bionic
假设清单文件中设定的分支是gingerbread-exdroid-stable,那么执行以上指令就是对platform/build、platform/bionic项目,在gingerbread-exdroid-stable的基础上创建特性分支stable。
4. repo checkout
<branchname> [<rpoject>...]{{{
repo checkout <branchname> [<project>...]
}}}
切换分支。 实际上是对git checkout命令的封装,但不能带-b参数,所以不能用此命令来创建特性分支。
示例:
repo checkout liuq-dev
repo checkout liuq-dev skipper/build platform/bionic
5. repo branches
repo branches [<project>...]
查看分支。
示例:
repo branches
repo branches skipper/build skipper/release
#查看可切换的分支
cd .repo/manifests
git branch -a | cut -d / -f 3
6. repo diff
repo diff [<project>...]
查看工作区文件差异。实际是对git diff命令的封装,用于分别显示各个项目工作区下的文件差异。在 commit 和工作目录之间使用 git diff 显示明显差异的更改。
示例:
#查看所有项目
repo diff
#只查看其中的两个项目
repo diff skipper/build skipper/release
7. repo stage
repo stage -i [<project>...]
把文件添加到index表中。实际上是对git add –interactive命令的封装,用于挑选各个项目中的改动以加入暂存区。
-i表示git add –interactive命令中的–interactive,给出一个界面供用户选择。
8. repo prune
repo prune [<project>...]
删除已经合并分支。实际上是对git branch -d 命令的封装,该命令用于扫描项目的各个分支,并删除已经合并的分支。
9. repo abandon
repo abandon <branchname> [<rpoject>...]
删除指定分支。实际是对git brance -D命令的封装。
10. repo status
repo status [<project>...]
查看文件状态。
示例:
#输出skipper/build项目分支的修改状态
repo status skipper/build
每个小节的首行显示项目名称,以及所在的分支的名称。
每个字母表示暂存区的文件修改状态。
字母 含义 描述 - 无变化 没有修改,在 HEAD 和在索引中是一样的 A 添加 不在HEAD中,在暂存区中 M 修改 在HEAD中, 在暂存区中,内容不同 D 删除 在HEAD中,不在暂存区 R 重命名 不在HEAD中,在暂存区中 C 拷贝 不在HEAD中,在暂存区,从其他文件拷贝 T 文件状态改变 在HEAD中,在暂存区,内容相同 U 未合并 需要冲突解决 第二个字符表示工作区文件的更改状态。
字母 含义 描述 - 新/未知 不在暂存区,在工作区 m 修改 在暂存区,在工作区,被修改 d 删除 在暂存区,不在工作区 两个表示状态的字母后面,显示文件名信息。如果有文件重名还会显示改变前后的文件名及文件的相似度。
11. repo remote
repo remote add <remotename> <url> [<project>...]
repo remote rm <remotename> [<project>...]
设置远程仓库。
示例:
repo remote add org ssh://10.11.10.11/git_repo
这个指令根据xml文件添加的远程分支,方便于向服务器提交代码,执行之后的build目录下看到新的远程分支org。
#删除远程仓库
repo remote rm org
12. repo push
repo push <remotename> [--all|<project>...]
向服务器提交代码。repo会自己查询需要向服务器提交的项目并提示用户。
示例:
repo push org
13. repo forall
repo forall [<project>...] -c <command>
迭代器,可以在所有指定的项目中执行同一个shell指令。
选项:
-c 后面所带的参数是shell指令,即执行命令和参数。命令是通过 /bin/sh 评估的并且后面的任何参数就如 shell 位置的参数通过。
-p 在shell指令输出之前列出项目名称,即在指定命令的输出前显示项目标题。这是通过绑定管道到命令的stdin,stdout,和 sterr 流,并且用管道输送所有输出量到一个连续的流,显示在一个单一的页面调度会话中。
-v 列出执行shell指令输出的错误信息,即显示命令写到 sterr 的信息。
附加环境变量:
REPO_PROJECT 指定项目的名称
REPO_PATH 指定项目在工作区的相对路径
REPO_REMOTE 指定项目远程仓库的名称
REPO_LREV 指定项目最后一次提交服务器仓库对应的哈希值
REPO_RREV 指定项目在克隆时的指定分支,manifest里的revision属性
如果-c后面所带的shell指令中有上述环境变量,则需要用单引号把shell指令括起来。
13.1. 添加环境变量
repo forall -c 'echo $REPO_PROJECT'
repo forall -c 'echo $REPO_PATH'
13.2. 合并多个分支
repo forall -p -c git merge topic
把所有项目都切换到master分支,执行上述指令将topic分支合并到master分支。
13.3. 打标签
repo forall -c git tag crane-stable-1.6
在所有项目下打标签。
13.4. 设置远程仓库
repo forall -c 'git remote add korg ssh://xiong@172.16.31/$REPO_PROJECT.git'
引用环境变量REPO_PROJECT添加远程仓库。
#删除远程仓库。
repo forall -c git remote rm korg
13.5. 创建特性分支
repo forall -c git branch crane-dev
repo forall -c git checkout -b crane-dev
14. repo grep
repo grep {pattern | -e pattern} [<project>...]
打印出符合某个模式的行。相当于对 git grep 的封装,用于在项目文件中进行内容查找。
示例:
#要找一行, 里面有#define, 并且有'MAX_PATH' 或者 'PATH_MAX':
repo grep -e '#define' --and -\( -e MAX_PATH -e PATH_MAX \)
#查找一行, 里面有 'NODE'或'Unexpected', 并且在一个文件中这两个都有的.
repo grep --all-match -e NODE -e Unexpected
15. repo manifest
repo manifest [-o {-|NAME.xml} [-r]]
manifest检验工具,用于显示manifest文件内容。
选项:
-h, –help 显示这个帮助信息后退出
-r, –revision-as-HEAD 把某版次存为当前的HEAD
-o -|NAME.xml, –output-file=-|NAME.xml 把manifest存为NAME.xml
16. repo version
repo version
显示repo的版本号。
选项:
-h, –help 显示这个帮助信息后退出.
17. repo upload
repo upload [--re --cc] {[<project>]...|--replace <project>}
repo upload 相当于git push,但是又有很大的不同。它不是将版本库改动推送到代码审核服务器(Gerrit软件架设)的特殊引用上,使用SSH协议。代码审核服务器会对推送的提交进行特殊处理,将新的提交显示为一个待审核的修改集,并进入代码审核流程,只有当审核通过后,才会合并到官方正式的版本库中。
选项:
-h, –help 显示帮助信息
-t 发送本地分支名称到Gerrit代码审核服务器
–replace 发送此分支的更新补丁集
–re=REVIEWERS 要求指定的人员进行审核
–cc=CC 同时发送通知到如下邮件地址
18. repo download
repo download {project change[/patchset]}...
repo download命令主要用于代码审核者下载和评估贡献者提交的修订。
贡献者的修订在Git版本库中refs/changes//引用方式命名(缺省的patchset为1),和其他Git引用一样,用git fetch获取,该引用所指向的最新的提交就是贡献者待审核的修订。
使用repo download命令实际上就是用git fetch获取到对应项目的refs/changes//patchset>引用,并自动切换到对应的引用上。
19. repo selfupdate
repo selfupdate
用于 repo 自身的更新。如果有新版本的repo存在, 这个命令会升级repo到最新版本。通常这个动作在repo sync时会自动去做, 所以不需要最终用户手动去执行。
选项:
-h, –help 显示这个帮助信息后退出.
–no-repo-verify 不要验证repo源码.
20. repo help
repo help [--all|command]
显示命令的详细帮助。
选项:
-h, –help 显示这个帮助信息后退出
-a, –all 显示完整的命令列表
参考文档:
http://blog.sina.com.cn/s/blog_89f592f50100vpau.html
https://github.com/Trawn/repo-help-zh-cn/blob/master/repo%20help%20zhcn.txt