repo 基本使用

时间:2025-01-26 15:12:59

前言

Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 repo 命令行工具,实际上python指令对git的一层封装,对 git 部分命令封装,将百多个 git 库有效的进行组织,因为源码仓库数量庞大,使用git进行管理会带来很多不便,这里repo就体现了其优越性。

一、安装

创建目录和修改环境变量

$ mkdir ~/bin
$ PATH=~/bin:$PATH

下载repo代码

$ curl /git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

二、帮助

repo help

查询具体命令的帮助
repo help <COMMAND>

Repo 仓库状态
repo help init

状态
repo status .

三、初始化

$ repo init -u <URL> [<OPTIONS>]

示例

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
 
repo init -u /platform/manifest

这个命令会在当前文件夹创建一个 .repo/ 文件夹,它包含

  • repo/ : 其实是一个repo的python源码
  • : 工作树的主配置文件,不要编辑这个文件
  • projects/ : 每个git工程的 .git结构
  • local_manifest.xml : 这个文件不是repo创建的,你可以创建这个文件来代替主配置文件,也就是临时测试用用

选项:

  • -u: 指定manifest仓库地址
  • -m: 选择仓库中某个manifest文件,如果没有设置,就使用
  • -b: 指定一个分支或修正版本

四、sync 同步所有项目文件

repo sync [project-list]

下载新的更改并更新本地环境中的工作文件。如果您在未使用任何参数的情况下运行 repo sync,则该操作会同步所有项目的文件。

运行 repo sync 后,将出现以下情况:

  • 如果目标项目从未同步过,则 repo sync 相当于 git clone。远程代码库中的所有分支都会复制到本地项目目录中。

  • 如果目标项目以前同步过,则 repo sync 相当于以下命令:
    git remote update
    git rebase origin/branch
    其中 branch 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则相应项目不会发生任何同步。

  • 如果 git rebase 操作导致合并冲突,请使用常规 Git 命令(例如 git rebase --continue)来解决冲突。

repo sync 运行成功后,指定项目中的代码即处于最新状态,已与远程代码库中的代码同步。

选项:

  • -j: 多任务,一般8核心可以开到16任务,过多会起反作用
  • -c: 只下载当前分支代码
  • -d: 让工程回退到manifest指定的版本
  • -f: 如果某个工程同步失败,继续同步
  • -s:同步到当前清单中的 manifest-server 元素指定的一个已知良好版本。

五、修改repo

如果你想修改repo的结构,应该在 .repo/manifests 文件夹里面修改,然后用git命令提交

文件结构:

<?xml version="1.0" encoding="UTF-8"?>  
<manifest>  
 
  <remote  name="shift"  
           fetch="git:///" />  
  <default revision="kk-shift"  
           remote="shift"  
           sync-j="1" />  
 
  <project path="packages/shift/VideoPlayer" name="platform/packages/shift/VideoPlayer" />  
  <include name="another_manifest.xml" />
</manifest>
  1. manifest
    这个是配置的顶层元素,即根标志

  2. remote
    name:在每一个.git/config文件的remote项中用到这个name,即表示每个git的远程服务器的名字(这个名字很关键,如果多个remote属性的话,default属性中需要指定default remote)。git pull、get fetch的时候会用到这个remote name。
    alias :可以覆盖之前定义的remote name,name必须是固定的,但是alias可以不同,可以用来指向不同的remote url
    fetch :所有git url真正路径的前缀,所有git 的project name加上这个前缀,就是git url的真正路径
    review :指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果

  3. default
    设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。
    remote :远程服务器的名字(上面remote属性中提到过,多个remote的时候需要指定default remote,就是这里设置了)
    revision :所有git的默认branch,后面project没有特殊指出revision的话,就用这个branch
    sync_j : 在repo sync中默认并行的数目
    sync_c :如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容
    sync_s : 如果设置为true,则会同步git的子项目

  4. manifest-server
    它的url属性用于指定manifest服务的URL,通常是一个XML RPC 服务
    它要支持一下RPC方法:
    GetApprovedManifest(branch, target) :返回一个manifest用于指示所有projects的分支和编译目标。
    target参数来自环境变量TARGET_PRODUCT和TARGET_BUILD_VARIANT,组成 T A R G E T P R O D U C T − TARGET_PRODUCT- TARGETPRODUCTTARGET_BUILD_VARIANT
    GetManifest(tag) :返回指定tag的manifest

  5. project
    需要clone的单独git
    name :git 的名称,用于生成git url。URL格式是: r e m o t e f e t c h / {remote fetch}/ remotefetch/{project name}.git 其中的 fetch就是上面提到的remote 中的fetch元素,name 就是此处的name
    path :clone到本地的git的工作目录,如果没有配置的话,跟name一样
    remote :定义remote name,如果没有定义的话就用default中定义的remote name
    revision :指定需要获取的git提交点,可以定义成固定的branch,或者是明确的commit 哈希值
    groups :列出project所属的组,以空格或者逗号分隔多个组名。所有的project都自动属于"all"组。每一个project自动属于
    name:‘name’ 和path:'path’组。例如,它自动属于default, name:monkeys, and path:barrel-of组。如果一个project属于notdefault组,则,repo sync时不会下载
    sync_c :如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
    sync_s : 如果设置为true,则会同步git的子项目
    upstream :在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间
    annotation :可以有0个或多个annotation,格式是name-value,repo forall命令是会用来定义环境变量

  6. include
    通过name属性可以引入另外一个manifest文件(路径相对与当前的 的路径)
    name :另一个需要导入的manifest文件名字
    可以在当前的路径下添加一个another_manifest.xml,这样可以在另一个xml中添加或删除project

  7. remove-project
    从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义

六、start 创建本地分支

repo start branch-name [project-list]

从清单中指定的修订版本开始,创建一个新的分支进行开发。

  • branch-name: 参数用于简要说明您尝试对项目进行的更改。如果您不知道,则不妨考虑使用名称 default。

  • project-list: 参数指定了将参与此主题分支的项目。

**注意:**句点 (.) 是一个简写形式,用来代表当前工作目录中的项目。

Example:创建三个分支test-1,test-2,test-3

repo start test-1 --all
repo start test-2 --all
repo start test-3 --all

七、status 状态查询

repo status [project-list]

对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行。

要仅查看当前分支的状态,请运行 repo status。系统会按项目列出状态信息。对于项目中的每个文件,系统使用两个字母的代码来表示:

在第一列中,大写字母表示临时区域与上次提交状态之间的不同之处

字母 含义 说明
- 没有变化 在 HEAD 与索引中相同
A 已添加 不存在于 HEAD 中,但存在于索引中
M 已修改 存在于 HEAD 中,但索引中的文件已修改
D 已删除 存在于 HEAD 中,但不存在于索引中
R 已重命名 不存在于 HEAD 中,索引中文件的路径已更改
C 已复制 不存在于 HEAD 中,复制自索引中的另一个文件
T 模式已更改 HEAD 与索引中的内容相同,但模式已更改
U 未合并 HEAD 与索引之间存在冲突;需要加以解决

在第二列中,小写字母表示工作目录与索引之间的不同之处

字母 含义 说明
- 新/未知 不存在于索引中,但存在于工作树中
m 已修改 存在于索引中,也存在于工作树中(但已修改)
d 已删除 存在于索引中,但不存在于工作树中

八、branches 分支

查看当前所有分支,相当于 git 下的指令 git branch -a

repo branches

已经创建了三个分支了

   test-1                    | in all projects
   test-2                    | in all projects
*  test-3                    | in all projects

九、abandon 删除分支

删除本地已经存在的某个分支,相当于 git branch -d <branch-name>

repo abandon [branch-name]

Example:删除本地分支test-3

repo adbandon test-3

十、一些问题

如果repo长时间没有响应,可以试试杀掉python进程

killall python

如果想要repo执行时的更多信息,可以加上 --trace 选项