1:repo简单介绍
repo是Google开发的用于管理Android版本库的一个工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库。repo不是用于取代git,而是简化了对多个Git版本库的管理。
repo可以帮助您统一管理多个Git版本库,包括但不限于:初始化、同步、提交、推送、拉取、合并等。
repo的使用方法如下:
-
安装repo
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
-
初始化repo
$ repo init -u git://github.com/android/platform_manifest.git
-
同步代码
$ repo sync
-
提交代码
$ repo start <branch> <project>... $ cd <project> $ git add . $ git commit -m "commit message" $ repo upload .
-
推送代码
$ repo upload .
-
拉取代码
$ repo sync
-
合并代码
$ repo sync $ repo start <branch> <project>... $ cd <project> $ git merge <branch> $ git commit -m "commit message" $ repo upload .
2:repo工作原理
谷歌其实是建立了一个 manifests 仓库来维护 Android 源码,而 mainfests 仓库保存这一个default.xml 文件,该文件就记录了 Android 源码中的各个子仓库的地址, 以及下载到本地哪个地方, 然后 repo 是用 python 编写的一个脚本, repo 脚本就会根据 default.xml 中配置进行批量下载:
manifest 的仓库地址如下所示, 也可以单独下载:
git clone git://mirrors.ustc.edu.cn/aosp/platform/manifest
打开.repo/manifests/default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
fetch=".."
review="https://android-review.googlesource.com/" />
<default revision="refs/tags/android-10.0.0_r45"
remote="aosp"
sync-j="4" />
<!—remote 标签指定远程仓库名字, fetch 是所有 git url 真正路径的前缀,所有 git 的 project name 加上这个前缀,就是 git url 的真正路径;review :指定 Gerrit 的服务器名,用于 repo upload 操作-->
<!—default 标签设定所有 projects 的默认属性值,如果在 project 元素里没有指定一个属性, 则使用 default 元素的属性值 -->
<!—project 标签name :git 的名称,用于生成 git url。URL 格式是:${remote fetch}/${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自动属于-->
<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" />
<!-- src 表示在 build/make/tools 目录, dest 表示本地路径 build/tools 软件链接文件链接到 src-->
<linkfile src="tools" dest="build/tools" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
<project path="build/kati" name="platform/build/kati" groups="pdk,tradefed" />
<project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" >
</manifest>