Repo简介
"Repo" 是一个用于管理多个Git存储库的工具,通常与Google的Android开发项目一起使用。它允许您在一个命令下轻松地进行多个Git存储库的同步、下载和管理。
repo下载安装
从清华镜像源下载
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo #~/bin/repo为repo下载本地的存放路径
chmod a+x ~/bin/repo
其实下载下来的repo文件只是一个使用Python编写的引导脚本(Google 称之为 Repo launcher,本质上是一个python脚本,可以使用vim打开的),完整的repo(即,repo的主体部分)还没有下载。
repo help
查看repo帮助说明,该帮助列举了repo所支持的子命令,及各个子命令的简要介绍。
如果需要查看某个具体子命令的详细介绍,执行命令repo help 即可。例如查看repo init的帮助,可以输入repo help init。
上一小节已经提及到了,下载下来的repo只是一个引导脚本,完整的repo工具还没有下载,此时执行repo help命令只能看到init和help两个子命令,而且帮助信息中还会提示repo还未安装,需要执行repo init安装。(需要注意repo init需要跟参数的,后面会单独介绍repo init的使用)
当执行完repo init下载了完整的repo工具之后,再执行repo help就会看到repo更多的子命令。
注意:repo init -u 后跟url地址,如果是自己项目,则是Android源码项目源码编辑的Repo的地址;如果是官方AOSP repo是官方配置好的,可以对比如下两个安装repo工具的方式:
repo init -u https://github.com/remote-android/platform_manifests.git -b redroid-11.0.0 --depth=1 --git-lfs # 自定义repo工具中描述源码仓库地址组织形式
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r1 # 官方AOSP repo中源码仓库组织形式
或者
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r12
如果需要某个特定的 Android 版本,特定版本标记查看
<https://source.android.google.cn/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds>
repo init -u 命令效果
首先当前目录产生一个.repo目录
然后克隆一份repo的源代码到.repo/repo下,里面存放了其他repo子命令,即repo的主体部分。
接着从manifest_git_path仓库地址clone清单库到.repo/manifests和.repo/manifests.git目录。
同时.repo目录下还包括manifest仓库(清单库)内容
.repo文件夹简介
执行repo init命令之后,会在当前目录创建一个.repo文件夹。
文件夹 描述
manifests manifest仓库(清单库)内容,即repo init的-u选项对应的仓库
manifests.git manifest仓库(清单库)的.git目录
manifest.xml 指明当前生效的Manifest文件,即repo init的-m选项对应的参数(没有该选项时默认为default.xml)
repo repo命令的主体,包含了最新的 repo 命令
manifest文件分析
所谓manifest仓库(清单库)其实就是存放manifest(清单)文件的仓库,实际上可以是任意仓库,只要该仓库中存在repo init命令-m选项指定的manifest文件即可,清单库命名为manifest只不过是一种约定俗成的写法罢了。
manifest仓库一般都会有一个manifests\default.xml文件,该文件为默认的manifest文件。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/"
review="https://android-review.googlesource.com/" />
<default revision="refs/tags/android-12.0.0_r32"
remote="aosp"
sync-j="4" />
<superproject name="platform/superproject" remote="aosp" revision="android-12.0.0_r32" />
<contactinfo bugurl="go/repo-bug" />
<project path="build/make" name="platform/build" groups="pdk" >
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
<linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
<linkfile src="core" dest="build/core" />
<linkfile src="envsetup.sh" dest="build/envsetup.sh" />
<linkfile src="target" dest="build/target" />
<linkfile src="tools" dest="build/tools" />
</project>
<project path="build/bazel" name="platform/build/bazel" groups="pdk" >
<linkfile src="bazel.WORKSPACE" dest="WORKSPACE" />
<linkfile src="bazel.sh" dest="tools/bazel" />
<linkfile src="bazel.BUILD" dest="BUILD" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
<project path="build/pesto" name="platform/build/pesto" groups="pdk" />
<project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
<project path="art" name="platform/art" groups="pdk" />
<project path="bionic" name="platform/bionic" groups="pdk" />
<project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" />
<project path="bootable/libbootloader" name="platform/bootable/libbootloader" groups="vts,pdk" />
<project path="compatibility/cdd" name="platform/compatibility/cdd" groups="pdk" />
<project path="cts" name="platform/cts" groups="cts,pdk-cw-fs,pdk-fs" />
<project path="dalvik" name="platform/dalvik" groups="pdk-cw-fs,pdk-fs" />
<project path="developers/build" name="platform/developers/build" groups="developers,pdk" />
省略一部分....
<repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />
</manifest>
清单文件各元素解释
-
<
manifest>
根标签这个是配置的顶层元素,即根标志
-
<
remote>
标签remote元素可以有多个,用于存在多个git远程服务器的情况。
-
name 即表示每个git的远程服务器的名字(这个名字很关键,如果多个remote属性的话,default属性中需要指定default remote)。git pull、get fetch的时候会用到这个remote name。
-
fetch :所有git url真正路径的前缀,所有git 的project name(就是后面的project标签的name元素)加上这个前缀,就是git url的真正路径;如果使用此remote的所有项目的前缀和manifest仓库前置一致的话,可以使用...代替。
repo init -u https://github.com/remote-android/platform_manifests.git -b redroid-11.0.0 的manifest仓库前置https://github.com/remote-android/
-
review:通过repo upload将评论上传到的 Gerrit 服务器的主机名。 该属性是可选的; 如果未指定,则repo upload将不起作用。
-
alias:该属性可以省略,当指定了该属性时,可以覆盖name属性设置每个项目的.git/config中的远程名称。不同remote元素的alias属性可以相同,比如不同remote元素的alias属性可以都是origin。
-
-
<
default>
标签元素default元素只能有一个。设定所有project标签的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。
- remote :远程服务器的名字(上面remote属性中提到过,多个remote的时候需要指定default remote,就是这里设置了)
- revision :所有git的默认branch,后面project没有特殊指出revision的话,就用这个branch
- sync_j : 在repo sync中默认并行的数目
-
<
superproject>
标签是该清单文件中的一个元素,用于定义一个超级项目(也称为"manifest项目")。超级项目是一个特殊的项目,它通常用于组织多个子项目。在Android源代码管理中,这些子项目可以是不同的软件组件、库、应用程序等。超级项目本身通常不包含实际的源代码,它主要用于管理和同步这些子项目的代码。
default.xml 文件中的 superproject 标签主要包含以下信息:
- name 属性:指定超级项目的名称。这个名称通常是一个唯一标识符,用于区分不同的超级项目。
- path 属性:指定超级项目的路径。这是超级项目在本地文件系统中的相对路径,Repo将会在该路径下创建一个文件夹来管理超级项目。
- remote 属性:指定与超级项目相关联的Git远程存储库的名称。这个远程存储库通常包含了清单文件的信息以及管理所有子项目的信息。
- revision 属性:指定要使用的Git分支、标签或提交ID。这决定了超级项目所管理的子项目的版本。
-
<
project>
标签需要clone的单独git,每一个代表了一个可以被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;如果这个project有一个parent属性,则该project最终的url会被这样拼凑
r e m o t e f e t c h / {remote_fetch}/ remotefetch/{project_parent}/${project_name}.git - path :指定仓库在本地文件系统中的路径。clone到本地的git的工作目录,如果没有配置的话,使用name属性值;相对于repo的根目录而言的相对路径;
- 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时不会下载
- 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;如果这个project有一个parent属性,则该project最终的url会被这样拼凑
-
copyfile 标签
project元素的子元素,每个元素描述了一对 src-dest 文件对。同步时(即执行repo sync命令时)src文件会被拷贝到dest。通常会被用于 README 或 Makefile 或其他构建脚本。
- dest:是相对于当前目录(执行repo init和repo sync命令的目录)的路径
- src:是相对于project标签的path属性值的相对路径
-
linkfile标签
与copyfile类似,只不过不是拷贝,而是进行一个符号链接。
-
include 标签
通过name属性可以引入另外一个manifest文件(路径相对与当前的manifest.xml 的路径),name:另一个需要导入的manifest文件名字
可以在当前的路径下添加一个another_manifest.xml,这样可以在另一个xml中添加或删除project
-
remove-project 标签
从内部的manifest表中删除指定的project。用于从清单文件中移除一个项目。这可以用于停止同步某个项目的代码。
-
annotation标签
提供对 元素的注释,用于描述仓库的用途或其他信息。
-
repo-hooks 标签
用于定义 Repo 在执行特定操作时应该触发的钩子(hooks)脚本。Repo 钩子是一种机制,允许你在特定的 Git 操作发生时自动执行一些自定义的脚本或命令。
- in-project:指定钩子脚本的相对路径,这是相对于当前 Repo 的路径。这个属性通常用于为特定 Repo 设置钩子脚本,而不是全局设置。
- enabled-list:一个用逗号分隔的钩子名称列表,指定哪些钩子应该在当前 Repo 上启用。这允许你选择性地启用或禁用 Repo 钩子。
搭建repo服务
- 简而言之:
部署通用的工具仓库git-repo.git。
部署自己的清单仓库manifests.git。
编写清单文件manifests.xml
批量创建工程子仓库和上传源代码。