1. repo
- [1. repo](#1. repo)
- [1.1. repo是什么](#1.1. repo是什么)
- [1.2. 安装](#1.2. 安装)
- [1.3. repo 命令](#1.3. repo 命令)
- [1.3.1. repo help](#1.3.1. repo help)
- [1.3.2. repo init](#1.3.2. repo init)
- [1.3.3. repo sync](#1.3.3. repo sync)
- [1.3.4. repo upload](#1.3.4. repo upload)
- [1.3.5. repo start](#1.3.5. repo start)
- [1.3.6. repo forall](#1.3.6. repo forall)
- [1.4. mainfest 文件](#1.4. mainfest 文件)
- [1.5. git-repo简介(非android repo)](#1.5. git-repo简介(非android repo))
- [1.6. 参考资料](#1.6. 参考资料)
1.1. repo是什么
- Repo 是一个 google 提供的 python 文件,实现了一些功能,最开始用于管理 Android 源码
- Repo 是用来管理多个 Git 仓库的,并可以同步这些仓库(上传、下载、合并、切换分支等)
- Repo 的重要输入参数是一个叫 manifest 的 xml 文件,这个文件描述了整个大项目的信息,通过 maifest 初始化
- repo相关的命令操作,相当于开启子线程执行对应的git操作,每个repo命令都可以在.repo/repo/subcmds下面找到对应的python子脚本
- 组成
- Repo脚本: python脚本本身
- Repo仓库:管理python代码的仓库,repo调用的命令(python实现的工具)
- Manifest仓库: 管理repo项目的清单文件仓库
- 子项目仓库:各个子项目的仓库
1.2. 安装
- 下载 repo 到某个目录(比如 ~/bin 目录), repo 其实就是个python脚本
- 下载地址
1.3. repo 命令
- repo常用命令
repo --trace init -u https://android.googlesource.com/platform/manifest -b branch_name -m default.xml
初始化reporepo sync
同步代码,类似于 pullrepo upload dev
push dev 分支到远程仓库repo branch或repo branches
列出分支repo status
状态查询repo diff
查看修改repo forall -c 'git reset --hard HEAD;git clean -df;git rebase --abort'
撤销整个工程的本地修改repo forall -c 'git branch master'
切换整个工程模块的分支repo forall -c 'git pull projectname'
更新整个工程模块的代码
repo与git命令对照表
| repo命令 | 等同git命令 | 备注 |
| ------------- | --------------------- |
| repo init -u | 无 | 初始化 |
| repo sync | git pull | 同步代码 |
| repo upload | git push | 上传代码 |
| repo forall | 无 | 多仓执行 |
| repo start | git checkout -b | 创建并切换分支 |
| repo checkout | git checkout | 切换分支 |
| repo status | git status | 状态查询 |
| repo branches | git branch | 分支查询 |
| repo diff | git diff | 文件对比 |
| repo prune | git remote prune origin | 删除合并分支 |
| repo stage --i | git add --interactive | 添加文件到暂存区 |
| repo abandon | git branch -D | 删除分支 |
| repo version | 无 | 查看版本号 |
- repo 脚本参数
- --repo-url=URL repo 工具本身的 git 库地址。缺省为:git://android.git.kernel.org/tools/repo.git
- --repo-branch=REVISION 使用repo的版本库,即repo git库的分支或者里程碑名称。缺省为caf-stable
- --no-repo-verify 设定不要对repo的里程碑签名进行严格的验证。
- -u(--manifest-url) 设定清单库的Git服务器地址。
- -b(--manifest-branch) 检出清单库的特定分支。
- --mirror 只在repo第一次初始化的时候使用,建立本地镜像
- -m(--manifest-name) 指定清单库中的某个清单为有效的清单文件。默认为default.xml。
- --no-tags don't fetch tags
- --trace 显示repo命令的执行过程
1.3.1. repo help
repo help
查看帮忙文档repo help sync
查看 sync 帮忙文档
1.3.2. repo init
- 完成repo工具的完整下载,执行的repo脚本只是一个引导工具,并不是下载代码的脚本。
- 克隆清单库manifest.git到目录.repo/manifests/下。(地址来自于-u参数)
- 清单文件.repo/manifest.xml只是符号链接,它指向.repo/manifests/default.xml。
- 如果.repo/manifests/目录中有多个xml文件,repo init -m 参数可以任意选择其中一个,默认是default.xml。
举例:
repo --trace init -u https://android.googlesource.com/platform/manifest -b branch_name -m default.xml && repo sync && repo start branch_name --all
--trace:查看repo背后的具体操作。
-u: 指定Manifest库的Git访问路径。
-m: 指定要使用的Manifest文件。
-b: 指定要使用Manifest仓库中的某个特定分支。
下载 https://android.googlesource.com/platform/manifest 到 .repo/manifests 目录下
clone .repo/manifests/default.xml 里的所有 git 仓库。可以有多个 xml 文件,通过 -m 指定
init之后,会生成 .repo 目录,内容如下
sh
tree .repo -L 1
.repo
├── manifest.xml -> manifests/default.xml
├── manifests
├── manifests.git
├── project-objects
├── project.list
├── projects
└── repo
5 directories, 2 files
- 文件夹用途
- manifests 清单文件的仓库
- manifests.git 清单文件的 Git 裸仓库,不带工作区
- manifest.xml 这是一个链接文件,指向你的用于初始化工作区的清单文件,即manifests/default.xml
- project.list 一个文本文件,里面包含所有项目名字的列表
- projects 该文件夹下包含所有 git project 的裸仓库,文件夹的层次结构跟工作区的布局一样
- repo 这是 repo 命令的主体,其中也包含最新的 repo 命令,推荐使用这里面的 repo 命令,也可以自定义
1.3.3. repo sync
- 如果是第一次运行 repo sync ,则相当于 git clone,会把 server 所有内容都拷贝到本地
- 如果目标项目已同步过,则 repo sync 相当于以下命令
git remote update && git rebase origin/<branch>
- repo sync 是不会更新 .repo/repo 这个仓
- 参数
- -j 开启多线程同步操作,会加快sync命令的执行速度。默认情况下,使用4个线程并发进行sync。
- -c, --current-branch:只同步指定的远程分支。默认情况下,sync会同步所有的远程分支
- -d, --detach
- 脱离当前的本地分支,切换到manifest.xml中设定的分支
- 在实际操作中这个参数很有用,当我们第一次sync完代码后,往往会切换到dev分支进行开发
- 如果不带该参数使用sync, 则会触发本地的dev分支与manifest设定的远程分支进行合并,这会很可能会导致sync失败。
- -f, --force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。
1.3.4. repo upload
- 等价于 git push
- repo upload [--re --cc] []...
- 如果您在未使用任何参数的情况下运行 repo upload,则该操作会搜索所有项目中的更改以进行上传。
1.3.5. repo start
repo start
是对git checkout -b
命令的封装git checkout -b
是在当前所在的分支的基础上创建特性分支,而repo start
是在清单文件中设定的分支的基础上创建特性分支repo start stable --all
(所有项目)- 假设清单文件中设定的分支是 gingerbread-stable,那么执行以上指令就是对所有项目,在 gingerbread-stable 的基础上创建特性分支 stable
repo start stable platform/build platform/bionic
可以指定项目
1.3.6. repo forall
repo forall [<PROJECT_LIST>] -c <COMMAND>
- 在每个项目中运行指定的 shell 命令。
- 通过 repo forall 可使用下列额外的环境变量:
- REPO_PROJECT 可设为项目的具有唯一性的名称。
- REPO_PATH 是客户端根目录的相对路径。
- REPO_REMOTE 是清单中远程系统的名称。
- REPO_LREV 是清单中修订版本的名称,已转换为本地跟踪分支。如果您需要将清单修订版本传递到某个本地运行的 Git 命令,则可使用此变量。
- REPO_RREV 是清单中修订版本的名称,与清单中显示的名称完全一致。
- 参数
-c
:要运行的命令和参数。此命令会通过 /bin/sh 进行求值,它之后的任何参数都将作为 shell 位置参数传递。-p
:在指定命令输出结果之前显示项目标头。这通过以下方式实现:将管道绑定到命令的 stdin、stdout 和 sterr 流,然后通过管道将所有输出结果传输到一个页面调度会话中显示的连续流中。-v
:显示该命令向 stderr 写入的消息。
1.4. mainfest 文件
- manifest 文件是 repo 工具的核心,它记录了所有 git 仓库的地址和分支
- 官方的 manifest 配置可以参考 .repo/repo/docs/manifest-format.txt
- https://github.com/GerritCodeReview/git-repo/blob/main/docs/manifest-format.md
xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote />
<default remote="origin" revision="master" sync-j="4" />
<project />
<project />
<project />
......
</manifest>
- 元素详情
manifest
元素xml 文件的根元素remote
元素- 可以存在一个或者多个 remote 元素,remote 元素指定了使用 repo upload 命令的时候,会将改变提交到哪个服务器
default
元素- default 元素中指定的属性都是一些缺省的属性。
- 即如果 project 元素中不存在该属性,则使用在 default 元素中指定的属性,所以这里的属性都可用于 project 元素。
revision
:Git 分支的名字。如果 project 元素没有指定 revision 属性,那么就使用 default 元素的该属性。revision 属性的值可以是一个 git branch,git tag,也可以是一个 commit id。sync-j
:sync 的时候,并行工作的任务数。sync-c
:如果设置为 true,则在同步代码的时候,将只会同步 project 元素中 revision 属性中指定的分支。如果 project 元素没有指定 revision 属性,则使用 default 元素的 revision 属性。
project
元素- xml 文件中可以指定一个或者多个 project 元素。
- 每一个 project 元素都描述了一个需要 pull 到本地的 git 仓库。
- project 元素中有很多可以使用的属性,在此只介绍几个我们经常使用的属性。
name
:git project 的名字,path
:该 project 的本地工作区的路径,revision
:见 default 标签描述
1.5. git-repo简介(非android repo)
-
git-repo
- Repo is a tool built on top of Git
- git-repo 是一款客户端工具,实现从客户端直接发起代码评审,适用Codeup。
- 对原生 git 命令做了封装,简化 AGit-Flow 等集中式工作流下用户的输入。
- git-repo 可以支持 Gerrit 以及 AGit-Flow 兼容的代码平台。
- git-repo 并不会改变 Git 用户的使用习惯,而是提供了对 Git 命令的扩展。git-repo 安装之后,为 Git 提供了一系列的子命令(git repo, git peer-review, ...)。
- 传统的代码评审工作模式,代码贡献者要将代码推送到个人/特性分支,再通过 Web 界面发起创建合并请求。整个过程要经历多个步骤,开发者要切换到不同的工具才能完成。
- 而使用git-repo,一个用户只要拥有仓库的读取权限,就可以在本地工作区中执行下面的一条命令
git peer-review
,将代码以合并请求的方式贡献到服务端。
-
git-repo 与 Android repo
-
Android 采用 Gerrit 提供代码评审服务,并且开发了一个客户端工具 repo,实现多仓库管理。git-repo 实现和安卓 repo 使用习惯上的兼容,两者的差异如下:
- Android repo 只支持 Gerrit 服务器。git-repo 采用了一套新的服务发现协议,支持 AGit-Flow 及其兼容的工作流,也支持 Gerrit 工作流。
- Android repo 只支持 manifests 仓库管理下的多仓库,而 git-repo 在此基础上,还支持单一 Git 代码仓的集中式工作流协同,并提供快捷的别名命令 git peer-review,或 git pr。
- Android repo 使用 Python 脚本语言开发,git-repo 使用 Go 语言开发,包含了完整测试用例。git-repo 安装简单,除了 Git 外,别无其他软件依赖。
bash
git clone https://gerrit.googlesource.com/git-repo