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

Android 系统使用 repo 管理源码,但是 Android 10 源码包含 732 个仓库,如果在本地 gitlab 服务器和 gerrit 服务器上将所有的仓库都创建一遍的话,仓库太多了, 不便于管理和审查,所以需要重新设计代码结构,并使用 repo 和 manifest 进行管理,为此,我先使用官方 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 会根据 xml 中project的 path 信息创建相应路径,并将代码解析到该路径。根据以上 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 status 与 git status 类似,不过前者针对的是所有仓库,后者针对某一个仓库。

.repo/repo/repo status

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

参考