用户工具


repo

批量管理git项目

manifest.xml文件结构如下

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="bare" fetch="file:///home/fangqiang/maketest/git/bare3/" />
    <default revision="branch_name" remote="bare" /> // revision 为每个项目指定分支
    <project name="test" path="test" groups="g1" revision="master"/>  //  revision 可以指定master, SHA,但是不能用tag(很奇怪)
    <project name="test2" path="test2" groups="g2" revision="17beafc4f040b1801e56e33e0ff2cba7c52f0d8d"/>
</manifest>

repo init

repo init 
-u	指定从哪个仓库下载,
-b	指定分支,
-m	指定manifest文件名称(默认master)
-g	指定项目组。

生成repo某个版本的manifest.xml

每次执行repo sync之后,执行一遍repo sync -r -o my_manifest.xml会成一个记录当前版本所有SHA值得manifest.xml文件(我猜测这个操作的底层是将repo sync之后每隔仓库中的 .git/HEAD文件中的值取出来而已)

文件 A 如下

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch="url" name="re"/>
  <default remote="re" revision="master"/>
  <project name="fang/test" path="test"/>
</manifest>

文件 B 日下 【 只是多了一个SHA值 和upstream(记录SHA所在的分支)属性 】

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch="url" name="re"/>
  <default remote="re" revision="master"/>
    <project name="fang/test" path="test" revision="d9b86b0ef8a373e3be6705f9f6ef4bb91e892d38" upstream="master"/>
</manifest>

repo文件详解

Android使用repo来管理多个git项目。它需要一个manifest XML文件来指示这些git项目的属性。

repo manifest XML可以包含下面的元素:

  • manifest: 最顶层的XML元素。
  • remote元素: 设置远程git服务器的属性,包括下面的属性
    • name: 远程git服务器的名字,直接用于git fetch, git remote 等操作
    • alias: 远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest中,
    • name不能重名,但alias可以重名。
    • fetch: 所有projects的git URL 前缀
    • review: 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。
  • default元素:设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。
    • remote: 之前定义的某一个remote元素中name属性值,用于指定使用哪一个远程git服务器。
    • revision: git分支的名字,例如master或者refs/heads/master
    • syncc: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
    • syncPRODUCT和TARGETVARIANT,组成$TARGETBUILDfetch}/${project“”“”“”c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
    • sync_s: 如果设置为true,则会同步git的子项目。
    • upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。
    • annotation: 可以有多个annotation,格式为name-value pair。在repo forall 命令中这些值会导入到环境变量中。
    • remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。
  • include: 通过name属性可以引入另外一个manifest文件(路径相对与manifest repository's root)。

本地manifest

本地的manifest文件存放在$(TOP_DIR)/.repo/local_manifest/*.xml。$TOP_DIR/.repo/local_manifests/local_manifest.xml
如果存在,会被最先装入。然后是以字母顺序的$TOP_DIR/.repo/local_manifests/*.xml文件。这些manifest会在repo sync
之前被处理。以便repo下载和管理额外的project。

 

Example:

  $ ls .repo/local_manifests

  local_manifest.xml

  another_local_manifest.xml

 

  $ cat.repo/local_manifests/local_manifest.xml

  <?xml version="1.0"encoding="UTF-8"?>

  <manifest>

    <project path="manifest"

             name="tools/manifest"/>

    <projectpath="platform-manifest"

             name="platform/manifest"/>

  </manifest>