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 是公钥
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 #管理员的公钥
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*
Git 工具相关概念资料,请搜索 progit 文档阅读理解。
a) 克隆 gitolite 管理仓库:
# git clone ssh://git@host/gitolite-admin.git
git clone ssh://[email protected]/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
这里略过了,基本上大家都知道。
获取到 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
目标:增加权限,并且创建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 的路径。
目标:创建 Manifest.xml 文件,用来管理 Android 源码中的 git 子仓库。
基于上一步服务器会生成一个空的 manifest.git
去另外一个路径(/home/qxzn/codes/),我们下载 manifest 仓库
# git clone ssh://git@host/repo/platform/manifest.git
git clone ssh://[email protected]/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
sed -i 's;revision=.*>;/>;g' rk3399_android-7.1.xml
sed -i 's;remote=.*>;>;g' rk3399_android-7.1.xml
修改为
git add rk3399_android-7.1.xml
git commit -m "add initial manifest for Android7.1"
git push origin master
我们需要一个纯净的 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://[email protected]/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
注意!使用脚本前请保证
ssh-agent bash
,ssh-add ~/.ssh/qxzn_rsa
../repo init -u ssh://[email protected]/repo/platform/manifest.git -b master
repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -u ssh://[email protected]/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://[email protected]/repo/device/htc/flounder-kernel
error: Cannot fetch device/asus/fugu-kernel from ssh://[email protected]/repo/device/asus/fugu-kernel
error: Cannot fetch device/moto/shamu-kernel from ssh://[email protected]/repo/device/moto/shamu-kernel
请确保 gitolite/conf/gitolite-admin.conf 中有正确的权限
error: Cannot fetch device/htc/flounder-kernel from ssh://[email protected]/repo/device/htc/flounder-kernel [132/1875]
error: Cannot fetch device/asus/fugu-kernel from ssh://[email protected]/repo/device/asus/fugu-kernel
error: Cannot fetch device/moto/shamu-kernel from ssh://[email protected]/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