RK3288 Android 10 系统开发[3] - 结合 gitlab 搭建 repo 代码仓库管理平台
目前为了本地服务器搭建 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
本地代码管理
前面在 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 使用 .
参考
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 litreily的博客!