使用 repo 管理项目代码 —— repo 清单配置
随着业务越来越复杂,代码库也随之越来越多,多个代码库的管理就显得更加重要。在 Android 源码开发中,Google 开发了一个 repo 脚本用于管理项目中的数百个仓库(之前拉取的一份 Android 源码中,有 514 个 Git 仓库)。个人在使用中需要如何使用 repo 来管理项目代码呢?
使用 repo 最重要的就是 repo 脚本和项目清单仓库,在执行repo init
执行过程中就会下载完整的 repo 仓库和项目清单仓库。repo 脚本是 Google 开发的,在 Android 源码中就包含了 repo 仓库,我们需要做的就是根据自己的项目来配置清单仓库。
1. 获取 repo 脚本
由于 Google 无法直接访问,我们可以使用清华镜像源中的 repo 脚本,或者使用我提供的github mirror
# 1. 获取 repo 脚本
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
# 或
# curl https://github.com/dezng/git-repo/raw/master/repo -o repo
# 2. 修改 repo 脚本
# 替换 repo 源, REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
# 或 REPO_URL = 'https://github.com/dezng/git-repo'
# 3. 授予执行权限
chmod +x repo
# 4. 添加到 PATH 环境变量中,或放置到 PATH 变量包含的目录中,此处选用第二种方式
sudo mv repo /usr/local/bin
使用下面的命令可以先下载一个 repo 示例
repo init -u https://github.com/dezng/AndroidLibManifests --repo-url=https://github.com/dezng/git-repo
2. 配置项目清单文件
repo 使用的项目清单是一个 git 仓库,默认配置是仓库中包含一个 default.xml
文件,此文件指定了项目地址和代码下载之后的目录结构。
2.1 default.xml
文件示例
<?xml version="1.0" encoding="UTF-8" ?>
<manifest>
<!--
remote: 远程代码库配置
name: 远程仓库名,在使用 git clone 时默认为 origin
fetch: 远程仓库地址,用户和 project 节点中的 name 一起确定项目地址
-->
<!-- remote server -->
<remote
name="github"
fetch="https://github.com" />
<remote
name="rx"
fetch="https://github.com/ReactiveX" />
<remote
name="square"
fetch="https://github.com/square" />
<!--
default: 默认配置
remote: 默认使用的远程仓库
revision: 默认使用的分支
sync-j: 同步代码时的并发数
-->
<default
remote="github"
revision="master"
sync-j="1" />
<!--
project: 单个代码库配置
name: 项目地址,和指定的 remote 节点中的 fetch 一起组成仓库地址(fetch + name)
group: 项目所属分组,可选
path: 项目拉取到本地后所在目录
remote: 指定所在远程仓库
revision: 指定代码分支
-->
<!-- RxJava -->
<project
name="RxJava"
group="android,rx"
path="lib/RxJava"
remote="rx"
revision="2.x" />
<!-- RxAndroid -->
<project
name="RxAndroid"
group="android,rx"
path="lib/RxAndroid"
remote="rx"
revision="2.x" />
<!-- OkHttp -->
<project
name="okhttp"
group="android,square"
path="lib/OkHttp"
remote="square" />
<!-- LeakCanary -->
<project
name="leakcanary"
group="android,square"
path="lib/LeakCanary"
remote="square" />
<!-- Retrofit -->
<project
name="retrofit"
group="android,square"
path="lib/Retrofit"
remote="square" />
<!-- Glide -->
<project
name="bumptech/glide"
group="android,bumptech"
path="lib/Glide"/>
<!-- Volley -->
<project
name="google/volley"
group="android,google"
path="lib/Volley"/>
</manifest>
remote: 可配置多个,一个项目清单中的代码可以来自不同服务器
project: 必须包含 name 和 path 属性,name 用于指定远程仓库位置,path 指定下载后的代码相对路径
project 中 path 可以很好的组织本地目录结构
2.2 创建清单仓库
mkdir manifests
cd manifests
vim default.xml
# 按示例配置 `default.xml`
# 初始化仓库
git init
git remote add xx REMOTE/URL
# 提交并 push 到远程
git add default.xml
git commit -m "init manifests"
3. 同步代码
# 初始化
repo init -u URL_FOR_MANIFEST_PROJECT
# 同步代码库
repo sync
4. 本地项目配置
使用 repo
统一配置项目代码之后,一些本地示例代码不需要的上传的可以使用 local_manifest 来处理,同步的过程中会同步更新。
配置文件:$TOP_DIR/.repo/local_manifests/*.xml
或 $TOP_DIR/.repo/local_manifest.xml
(deprecated)
local_manifests
中的项目在repo sync
过程中会同时同步下来,local_manifest.xml
中的项目会优先加载,在local_manifests
中的文件会已字母顺序加载。
5. 总结
以上,repo
就可以用来管理所有的项目