当前位置: 首页 > 工具软件 > Gitolite > 使用案例 >

[Android7.1] Gitolite + Repo 管理 Android 源码

彭霄
2023-12-01

Author: Younix
Platform: RK3399
OS: Android 7.1
Kernel: 4.4.126
Version: v2019.06


准备工作

1、安装基础的程序

sudo apt-get install ssh git

2、生成密钥对

ssh-keygen -t rsa

PS:连续三次回车,即在本地生成了公钥和私钥,不设置密码,生成的公钥私钥在~/.ssh目录下,rsa 是私钥, rsa.pub 是公钥

GIT服务器建立(基于GITOLITE)

服务器安装 gitolite(服务端操作):

a) 创建 git 账户:

sudo adduser --system --shell /bin/bash --group qxzn-git
Adding system user `qxzn-git' (UID 112) ...
Adding new group `qxzn-git' (GID 121) ...
Adding new user `qxzn-git' (UID 112) with group `qxzn-git' ...
Creating home directory `/home/qxzn-git' ...

sudo passwd qxzn-git

b) 下载源码

git clone https://github.com/sitaramc/gitolite.git

c) 以 “git” 账户登录Linux 系统/ 或者直接:

su - qxzn-git

d) 确保“~/.ssh/authorized_keys”为空或者不存在。
e) 拷贝服务器管理员 qxzn 的公钥到 “$HOME/qxzn_rsa.pub”。

cp /home/qxzn/.ssh/qxzn_rsa.pub $HOME/
chmod 600 qxzn_rsa.pub

f) 执行:

mkdir -p $HOME/bin

g) 执行下列命令安装,不同版本安装方法不同,请参考源码中的文档:

gitolite/install -to $HOME/bin

h) 执行:

$HOME/bin/gitolite setup -pk qxzn_rsa.pub #管理员的公钥

给 GIT 用户添加下载权限(服务端操作)

a)如果没有就在$HOME 帐号下建一个.ssh 隐藏目录,并且把管理员帐号下面的 id_rsa(这个是管理员的密钥) 复制到刚建立的.ssh 下
b)更改密钥的组权限

sudo chown git:git ~/.ssh/qxzn_rsa*

我这里因为已经去 /etc/sudoer 给了 git sudoer 权限,所以可以直接操作。你可能需要先切换到 root 用户下才能操作。
c)改权限(注意私钥必须是600,权限太高的话不行)

sudo chmod 600 ~/.ssh/qxzn_rsa*

使用 gitolite-admin 来管理服务器权限(在客户端操作)

Git 工具相关概念资料,请搜索 progit 文档阅读理解。
a) 克隆 gitolite 管理仓库:

# git clone ssh://git@host/gitolite-admin.git
git clone ssh://qxzn-git@10.10.7.83/gitolite-admin.git

b) 添加用户公钥

cd gitolite-admin
cp ~/.ssh/kent_rsa.pub keydir/kent_rsa.pub

c) 添加管理员用户
vi conf/gitolite.conf

@admin = qxzn
repo gitolite-admin
		RW+ = @admin

d) 提交生效
每次修改conf/gitolite.conf 内容都要提交才会生效

git add conf/gitolite.conf
git commit "add usergroup"
git push origin master

还需要以下两项功能的可以参考下面这个博客:
Gitdaemon(守护进程,开放一个公共的 git clone 服务,可选)
Gitweb(提供像Github一样的Web服务,通过浏览器查看版本库记录,可选)
http://blog.chinaunix.net/uid-26185912-id-3351963.html

REPO 镜像安装

1. 获取 RK SDK(在客户端上的操作)

这里略过了,基本上大家都知道。

获取到 SDK 后,我们获取 projects 列表,用于后面编写 gitolite.conf

.repo/repo/repo list -n > projects.txt
sed -i 's/^repo//' projects.txt (repo 指的是前面创建文件夹的名字,list 会把那个加上)
sed -i 's/^/@rk\ = \ repo\//' projects.txt

2. 创建 project tree(在客户端的操作)

目标:增加权限,并且创建repo/platform/manifest.git仓库。

将上面步骤的 projects.txt 内容添加到gitolite-admin/conf/gitolite.conf 中:

cd path_of_gitolite-admin # 进入 gitolite-admin 的路径
echo "" >> conf/gitolite.conf # 添加个空行
cat projects.txt >> conf/gitolite.conf

添加组权限,在文件最后(所有“@rk = repo/…”后面)添加如下内容:

vi conf/gitolite.conf
@user = user1 user2 user3
@rk = repo/platform/manifest

repo @rk
    R = @usergroup
    RW+ = @admin
	RW+ = qxzn_rsa

PS:push 后,我们在 /home/qxzn-git/ 下可以看到 repositories/repo 目录中即生成了 conf/gitolite.conf 中指定的目录结构。
比如 @rk = repo/platform/manifest 此设置上传后,会在相应的服务端上创建出一个空的manifest.git仓库,作为下一步的基础。
home/qxzn-git/repositories/repo 目录即为我们后面实现 manifest.xml 的 remote fetch 的路径。

3. MANIFEST 创建(在客户端操作)

目标:创建 Manifest.xml 文件,用来管理 Android 源码中的 git 子仓库。
基于上一步服务器会生成一个空的 manifest.git
去另外一个路径(/home/qxzn/codes/),我们下载 manifest 仓库

# git clone ssh://git@host/repo/platform/manifest.git
git clone ssh://qxzn-git@10.10.7.83/repo/platform/manifest.git
# 如果出现没有权限之类的错误,请确认 gitolite-admin/conf/gitolite.conf 中 R、RW+ 等权限设置是否正确

进入manifest工程,从server中之前获取的 RK 源码中拷贝一份manifest.xml 并上传

cd manifest
scp qxzn-git@host:/home/qxzn-git/rk3399/.repo/manifest.xml ./rk3399_android-7.1.xml

第一个参数的 manifest.xml 指的是从 RK 服务器同步下来的 xml (实际上是指向 manifests/rk3399_nougat_release.xml)
第二个参数拷贝到本的绝对地路径为 /home/qxzn/codes/manifest/rk3399_android-7.1.xml,
这个对应着在 qxzn-git 服务器上的 manifest 仓库中 /home/qxzn-git/repositories/repo/.repo/manifests 目录下面的 xml。

在复制完成后,打开改名后的 xml 文件,进行修改(非常关键)
规则语法参考(务必先了解规则):repo的manifest.xml文件全解 https://blog.csdn.net/nwpushuai/article/details/79252297

  1. 删除 revision 、upstream
sed -i 's;revision=.*>;/>;g' rk3399_android-7.1.xml
  1. 删除 remote
sed -i 's;remote=.*>;>;g' rk3399_android-7.1.xml
  1. 修改 remote fetch
    刚获取到的 rk3399 manifest.xml 应该是这样的
  <remote fetch="." name="aosp"/>
  <remote fetch="." name="rk"/>
  <default remote="aosp" revision="refs/tags/android-7.1.2_r6" sync-c="true" sync-j="4"/>

修改为

<remote fetch="ssh://qxzn-git@10.10.7.83/repo" name="origin"/>
<default remote="origin" revision="master" sync-j="4"/>
  1. 提交
git add rk3399_android-7.1.xml
git commit -m "add initial manifest for Android7.1"
git push origin master

4. 将 RK SDK 提交到 qxzn-git 服务器的 repo 仓库中

我们需要一个纯净的 RK SDK:

# 删除所有的 .git 子仓库
find . -name ".git" | xargs rm -rf

# 删除 .repo 
rm .repo -rf

# 查看纯净的代码大小
du -sh .
24G # RK3399 的代码大概在 24G 左右

接下来根据之前我们修改的 rk3399_android-7.1.xml 里面描述的目录结构生成新的 .git 仓库树并提交到远程仓库:
使用以下 python3 的脚本实现
https://github.com/dearsq/Note-xiaoshujiang/blob/master/Environment/Android7.1_RK3399_getnames_and_init_push_git_proj.py

# 进入 24G 源码目录
cd rk3399 
# 拷贝py脚本 和 manifest.xml 文件(rk3399_android-7.1.xml)到当前目录
cp [Android7.1_RK3399_getnames_and_init_push_git_proj.py] ./
cp [rk3399_android-7.1.xml] ./

# 修改脚本中 remote 部分的地址
# 脚本中 remote = 'ssh://qxzn-git@10.10.7.83/repo' 根据自己实际情况进行修改
vi Android7.1_RK3399_getnames_and_init_push_git_proj.py

# 执行脚本
chmod +x Android7.1_RK3399_getnames_and_init_push_git_proj.py
./Android7.1_RK3399_getnames_and_init_push_git_proj.py rk3399_android-7.1.xml

注意!使用脚本前请保证

  1. python3 工具已经安装正确
  2. git config --global user.name 等都正确配置
  3. id_rsa 等密钥正常添加,ssh-agent bashssh-add ~/.ssh/qxzn_rsa

Repo 下载测试

../repo init -u ssh://qxzn-git@10.10.7.83/repo/platform/manifest.git -b master
repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -u ssh://qxzn-git@10.10.7.83/repo/platform/manifest.git -b master -m rk3399_android-7.1.xml

如果没有 -m 指定 xml, 会使用名为 default 的 xml

repo sync

如果没有 repo 的话, 参考 https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

错误集锦

权限问题

如果碰到类似如下错误:

FATAL: R any repo/device/moto/shamu-kernel qxzn_rsa DENIED by fallthru
(or you mis-spelled the reponame)
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
error: Cannot fetch device/htc/flounder-kernel from ssh://qxzn-git@10.10.7.83/repo/device/htc/flounder-kernel
error: Cannot fetch device/asus/fugu-kernel from ssh://qxzn-git@10.10.7.83/repo/device/asus/fugu-kernel
error: Cannot fetch device/moto/shamu-kernel from ssh://qxzn-git@10.10.7.83/repo/device/moto/shamu-kernel

请确保 gitolite/conf/gitolite-admin.conf 中有正确的权限

error: Cannot fetch device/htc/flounder-kernel from ssh://qxzn-git@10.10.7.83/repo/device/htc/flounder-kernel [132/1875]
error: Cannot fetch device/asus/fugu-kernel from ssh://qxzn-git@10.10.7.83/repo/device/asus/fugu-kernel
error: Cannot fetch device/moto/shamu-kernel from ssh://qxzn-git@10.10.7.83/repo/device/moto/shamu-kernel

参考文档

基于 RK 官方文档 https://wenku.baidu.com/view/99fb9e2ea98271fe900ef93d.html
和 lzpdz 小伙伴的笔记 https://blog.csdn.net/lzpdz/article/details/51672161
进行梳理,更正了两者中过期以及错误的地方
补充相见恨晚的一篇文章 http://nicekwell.net/blog/20171112/ba-yi-you-de-repogong-cheng-ti-jiao-dao-fu-wu-qi.html#repo-1

 类似资料: