RK3288 Android 10 系统开发[3] - 结合 gitlab 搭建 repo 代码仓库管理平台

目前为了本地服务器搭建 gitlab 管理平台,并配合 gerrit 进行代码审查,需要对代码管理重新部署。

Android 系统使用 repo 管理源码,但是 Android 10 源码包含 732 个仓库,如果在本地 gitlab 服务器和 gerrit 服务器上将所有的仓库都创建一遍的话,仓库太多了, 不便于管理和审查,所以需要重新设计代码结构,并使用 repomanifest 进行管理,为此,我先使用官方 gitlab 搭建了一些测试仓库。用于学习和研究 repo 的代码管理方式。

gitlab 操作

新建 group

首先在 gitlab 上创建一个新的 group,我这里命名为 repo-test, 然后 gitlab 会自动分配一个group链接 "https://gitlab.com/te3597/"

新建空仓库

在新建好的 repo-test 组下新建以下空仓库

  • git-repo
  • manifest
  • sdk
  • kernel
  • uboot
  • frameworks_base

将仓库的克隆路径保存下来

https://gitlab.com/te3597/git-repo.git
https://gitlab.com/te3597/manifest.git
https://gitlab.com/te3597/kernel.git
https://gitlab.com/te3597/uboot.git
https://gitlab.com/te3597/frameworks_base.git

repo-test

本地代码管理

前面在 gitlab 上将远程仓库创建好了,本地在创建对应的仓库目录,并初始化仓库,配置好远程仓库。

mkdir repo-test
cd repo-test
for dir in manifest sdk uboot kernel frameworks_base
do
    mkdir $dir; cd $dir; git init; git remote add gitlab https://gitlab.com/te3597/$dir.git; cd -
done

下载 repo

首先需要下载 repo

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod +x ~/bin/repo

下载 git-repo

下载 git-repo 是为了方便国内访问,因为 git-repo 服务器在国外无法直接访问。

以上是git-repo 官方路径,但是国内可能无法直接访问。需要梯子或者使用其它下载源,具体参考博客 下载安装和使用git-repo

下载完成后,同样放置在 repo-test 目录,这样就把所有仓库目录都准备好了。

$ ls
frameworks_base  git-repo  kernel  manifest  sdk  uboot

添加代码

在处理 git-repo, manifest 外的其它仓库时,添加一些文件,或者目录,然后提交一次commit,并将代码推送到 gitlab, 以 kernel 目录为例。

cd kernel
touch REAMDE
echo test > README
git add .
git commit -m "init commit"
git push gitlab master

针对 git-repo, 需要添加一个新的remote,并推送上去。

cd git-repo
git remote add gitlab https://gitlab.com/te3597/git-repo.git
git checkout -b master
git tag v1.0.0
git push gitlab master

manifest

repo 需要使用 *.xml 文件管理所有仓库目录,用以确定各个仓库的下载路径本地部署路径, 这个 xml 文件可以单独存放在 manifest 仓库中。

针对当前测试项目,编写的 test.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <notice>DO NOT MODIFY!!!! THIS IS A BRANCH MANIFEST</notice>

  <remote fetch="https://gitlab.com/"  name="gitlab" review="null"/>

  <default remote="gitlab" revision="master"/>

  <project name="te3597/uboot"                 path="u-boot"               remote="gitlab"   revision="master"/>
  <project name="te3597/kernel"                path="kernel"               remote="gitlab"   revision="master"/>
  <project name="te3597/sdk"                   path="."                    remote="gitlab"   revision="master"/>
  <project name="te3597/frameworks_base"       path="frameworks/base"      remote="gitlab"   revision="master"/>

</manifest>

可以看到其中主要用到4种节点。

notice: 注意信息
remote: 远程仓库链接,名称等信息;可以包含多个 <remote> 节点
default: 仓库默认的remote,与 <remote> 节点对应;以及默认分支,这里是“master”
project: 仓库信息,包含name:名称,path: 本地部署路径,remote:远程服务器,revision:分支

在使用 repo sync 同步代码时,每个仓库的链接组成如下:

<remote-fetch>/<project-name>

# examples: uboot
remote-fetch: "https://gitlab.com"
project-name:  "te3597/uboot"
project-url: "https://gitlab.com/te3597/uboot"

repo sync 时,repo 会根据 xmlprojectpath 信息创建相应路径,并将代码解析到该路径。根据以上 test.xml 信息可知,同步后的代码结构如下:

.repo sdk-files u-boot/uboot-files kernel/kernel-files frameworks/base/frameworks_base-files

repo 操作

在代码全部提交到gitlab后,其它人就可以通过 repo 去下载同步和管理代码了。

repo init

$ mkdir root
$ cd root
$ git clone https://gitlab.com/te3597/git-repo.git ..

# download manifest
$ ../git-repo/repo init -u https://gitlab.com/te3597/manifest.git  -b master -m test.xml --no-repo-verify

repo sync

repo sync 会根据 test.xml 挨个从远程仓库拉取仓库代码到本地。

# repo sync
$ .repo/repo/repo sync

repo list

# repo list
$ .repo/repo/repo list
. : te3597/sdk
frameworks/base : te3597/frameworks_base
kernel : te3597/kernel
u-boot : te3597/uboot

repo forall

repo forall 是针对所有仓库的遍历操作,后面添加 -c <cmds> 可以遍历所有仓库并执行相应指令。

比如想要切换所有仓库的分支。

.repo/repo/repo forall -c git checkout -b master

repo status

repo statusgit status 类似,不过前者针对的是所有仓库,后者针对某一个仓库。

.repo/repo/repo status

repo 的其它相关操作可以参考 Google 安卓源码管理文档 repo 使用 .

参考