前两文 gitolite 代码仓库基本构建完成,使用中会遇到要新建、删除分支仓库。或者增加外部代码仓库,问题来咯。如何在现有基础上构建新代码仓? 如何在现在代码仓中删除制定目录?如何在同步代码时间 检出制定提交点相关代码?
提示:此文章为逆向构建 gitote 托管代码仓库repo。
a) gitolite 管理 repo 镜像仓增加 git 仓
b) gitolite 管理 repo 镜像仓删除 git 仓
c) repo 同步时检出制定提交点代码
d) Android repo 检出后的源码 逆向生成 repo mirror 仓库
Android repo 镜像仓搭建完成后,实际开发过程中会增加新的代码,此时代码不在任何一个git目录下 需新建git仓无疑是最优解。gitolite负责repo mirror仓授权管理,授权时增加一个新git路径配置,再由用户上传源码;新增加git仓就是这么简单。同理想要删除某些仓改写 xxx_repo.conf 配置信息即可。
以 rk356x android11 中添加 gps库为例,rk356x-s.conf 中添加仓路径libgps可提交代码仓路径
cd ~/gitolite-admin
vi conf/rk356x-s.conf
# rk356x-s.conf 仅有一行包含太多内容,此处仅有 要增加的内容
+ 356x-s/rk/hardware/rk29/libgps
路径增加后并提交到 gitolite 本地记录,经便利处理后 会在相对 repositories/ 新建 356x-s/rk/hardware/rk29/libgps 路径文件夹。
回到本地源码中,提交代码
cd ~/rk356x-s #镜像仓路径为 ~/repositories/rk356x-s,此处本地代码
cd hardware/rockchip/libgps
git init
git commit -a "commit logs xxxx"
git remote add rk git@gitolite-IP:356x-s/rk/hardware/rk29/libgps
git push rk
$ git branch -a
* master
remotes/rk/master
#此时新家git仓已成功
gitolite 上”删除“ git仓 更认为是屏蔽某些路径读写权限,获取不到等同于删掉。
cd ~/gitolite-admin
vi conf/rk356x-s.conf
# rk356x-s.conf 仅有想屏蔽的代码仓,以刚添加为例
- 356x-s/rk/hardware/rk29/libgps
如1.1中增加新git仓后 每次使用sync同步代码时都更新不到,即便全部重新拉取源码也没有,重要原因 repo 初始化的 manifest_xxx.xml 中未包含相关仓库信息。接下来要讲得就是使用 manifests 整理代码。
执行 repo sync命令时会同步代码,如果本地代码提交新与提交代码 本地提交记录会被还原,如果晚于呢则会更新。这是为什么? 原因还是 repo 配置文件 manifests。
因此 repo 管理的代码更新时,优先更新manifest,再同步其他 git 仓。
cd .repo/manifests/
git fetch origin
git pull
.repo/repo/repo sync
#后续都是常规操作
...
如果是检出指定时间的 manifests提交点的代码呢?
repo 初始化时 会选择默认 manifest_xxx.xml ,同步时会检出 manifest_xxx.xml 中提交点。同步时制定的提交点,重新初始化 manifest 即可
cd ~/rk356x-s
.repo/repo/repo init -m manifest_xxx.xml
#建议先切换到 默认master 分支,再操作义以免代码被覆盖
#若果不小心被覆盖,也有办法恢复
#切换到 master 分支
.repo/repo/repo forall -c git checkout master
#切换成功后执行同步
.repo/repo/repo sync
#如下报错生成的xml 提交内容在代码仓找不到,生成manifest_xxx.xml 对应路径提交补丁即可解决
File "/home/git/356x-s/.repo/repo/project.py", line 2747, in runner
(self._project.name, name, p.stderr))
GitError: platform/frameworks/base update-ref: fatal: 827f1b20ad9a1440047a7c3559536c049b015fa2^0: not a valid SHA1
同步完成后,发现刚刚按照 1.1 新增加 git仓未被检出,如何处理呢?
答案:在代码目标 manifest_xxx.xml 中增添刚添加的 git 仓配置信息,然后提交到远程分支。其它人再次同步时,可以拉去刚新增git仓。
# 下载原始 manifests 仓库
cd ~/rk356x-s/.repo/manifests #仅为参照,实际按照要处理的代码路径填写路径信息
vi manifest_xxx_new.xml
<project dest-branch="master" name="rk/rkbin" path="rkbin" revision="a6f95898dbfa05581747342dff07e9620642b3e8" upstream="master"/>
+ <project dest-branch="master" name="rk/hardware/rk29/libgps" path="hardware/rockchip/libgps" revision="e383251a22fef7213b7e5a804e4c7a7ca621c80d" upstream="master"/>
# 修改后提交到远程分支 立即生效
# 其他人执行重新初始化 mainfest_xxx_new.xml即可拉到去包含新 git 仓代码
.repo/repo/repo init -m manifest_xxx_new.xml
代码提交到远程分之后,其他人如何同步相同提交点代码?
此时需要使用相同 manifests,再同步代码。
问题来喽,如何更新 mainfests ?
#生成本地代码 manifest.xml
.repo/repo/repo manifest -r -o manifest_xxx_new.xml # manifest_xxx_new.xml 中 xxx根据实际自己命名
cp manifest_xxx_new.xml .repo/manifests/
git add manifest_xxx_new.xml
git commint . -m "mainfest xxx brief"
git push origin branch_name
其他人按照 检出指定时间的 manifests提交点的代码 方法同步代码。
思路一 按照单独建 git 仓方法,逐个建仓然后上传。工作量大、易出错,不明智。
思路一升级 改写脚本批量操作,耗费时间过多 不理想
思路二 参照 gitolite 管理仓方法,逆向生成 xxx.conf 配置信息,由 gitolite 建初始仓;本地代码统一上传到 mirror仓。
# 生成 repo list
.repo/repo/repo list -n > rk356x-s.conf
cd ~/rk356x-s
.repo/repo/repo list -n > rk356x-s.conf
sed -i 's/^/harmony\//g' rk356x-s.conf
sed -i 's/\n/ /g' rk356x-s.conf
sed ':a;N;s/\n/ /;t a' rk356x-s.conf > .rk356x-s.conf; mv .rk356x-s.conf rk356x-s.conf
sed -i 's/^/@harmony = /g' rk356x-s.conf
#此时的配置信息 不包含 manifests仓,需手动添加
vi rk356x-s.conf
# 行尾增加 注意空格
+ rk356x-s/manifests.git
cd ~/gitolite-admin
# 拷贝代码路径配置文件
cp ~/rk356x-s/rk356x-s.conf ./conf/
vi conf/gitolite.conf
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -1,2 +1,8 @@
repo gitolite-admin
RW+ = git
+
+include "rk356x-s.conf"
+
+@users = git user_a user_b
+repo @rk356x-s
+ RW+ = @users
#保存,提交到本地
git add conf/rk356x-s.conf
git commit ./ -m "output rk356x s repo mirror"
# 提交到远程生效
git push origin
cd ~/rk356x-s
.repo/repo/repo upload #此方法仅为提交存代码,不建议使用
Upload project buildroot/dl/ to remote branch master:
branch master ( 8 commits, Fri Apr 9 10:06:27 2021 +0800):
40bcf8fd dl: add packages for pre-build
b553a085 dl: remove the linux kernel version
44eb5692 dl: update packages for chromium
7b5eef20 dl: update packages libv4l-rkmpp and openssl
ca270188 libunwind: Update to 1.5.0
e7108d6d qemuu: Update to 5.1.0
c7be9fe0 qt5: Add 5.15 packages
540d29c4 mesa3d: Update to 20.3.4
直接上传发现无法成功,该如何处理?
B-: ssh://git@127.0.0.1:356x-linux/android/rk/u-boot
ssh: Could not resolve hostname 127.0.0.1:356x-linux: Name or service not known
fatal: 无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在。
勘查提示log remote URL 异常导致无法提交。Bingo ! 整理脚本自动更改 URL 并推送到镜像仓库。
cd ~/356x-linux
vi mirror.sh #内容补充到下文
chmod u+x mirror.sh
#!/bin/bash
# *********************** #
# Author by Sanle
# *********************** #
URLA="git@www.rockchip.com.cn/linux"
URLB="git@127.0.0.1/356x-linux"
str=$(git remote -v)
origin=$(echo $str | cut -d " " -f1)
url=$(echo $str | cut -d " " -f2)
if grep -q "$URLA" <<< "$url"; then
echo A-: ${url/$URLA/$URLB}
git remote set-url $origin ${url/$URLA/$URLB}
git push $origin --mirror
elif grep -q "$URLB" <<< "$url"; then
echo B-: $url
git push $origin --mirror
fi
exit 0
调用 自动执行命令,开启上传模式;等待执行结束代码仓库构建完成。
提示:执行脚本要用绝对路径,如不懂请翻看
《repo 命令速查》。
.repo/repo/repo forall -c /build/356x-linux/mirror.sh
A-: ssh://git@127.0.0.1/356x-linux/linux/app/QLauncher
枚举对象中: 608, 完成.
对象计数中: 100% (608/608), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (216/216), 完成.
写入对象中: 100% (608/608), 789.73 KiB | 197.43 MiB/s, 完成.
总共 608 (差异 384),复用 607 (差异 384)
remote: 处理 delta 中: 100% (384/384), 完成.
To ssh://127.0.0.1/356x-linux/linux/app/QLauncher
* [new branch] master -> master
* [new branch] m/linux -> m/linux
* [new branch] rk/develop -> rk/develop
* [new branch] rk/master -> rk/master
* [new branch] rk/rk3326 -> rk/rk3326
* [new branch] rk/rk3328/ott/1.0 -> rk/rk3328/ott/1.0
* [new tag] linux-4.19-gen-rkr1 -> linux-4.19-gen-rkr1
* [new tag] linux-4.19-gen-rkr2 -> linux-4.19-gen-rkr2
* [new tag] linux-5.10-gen-rkr1 -> linux-5.10-gen-rkr1
* [new tag] linux-5.10-gen-rkr2 -> linux-5.10-gen-rkr2
* [new tag] linux-5.10-gen-rkr3 -> linux-5.10-gen-rkr3
A-: ssh://git@127.0.0.1/356x-linux/linux/app/aiserver
枚举对象中: 887, 完成.
对象计数中: 100% (887/887), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (348/348), 完成.
写入对象中: 100% (887/887), 3.48 MiB | 93.65 MiB/s, 完成.
总共 887 (差异 530),复用 887 (差异 530)
remote: 处理 delta 中: 100% (530/530), 完成.
To ssh://127.0.0.1/356x-linux/linux/app/aiserver
* [new branch] master -> master
* [new branch] m/linux -> m/linux
* [new branch] rk/master -> rk/master
* [new tag] linux-4.19-gen-rkr1 -> linux-4.19-gen-rkr1
* [new tag] linux-4.19-gen-rkr2 -> linux-4.19-gen-rkr2
A-: ssh://git@127.0.0.1/356x-linux/linux/app/eptz_demo
....
A-: ssh://git@127.0.0.1/356x-linux/linux/yocto/meta-rockchip
枚举对象中: 6729, 完成.
对象计数中: 100% (6729/6729), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2760/2760), 完成.
写入对象中: 100% (6729/6729), 9.45 MiB | 27.89 MiB/s, 完成.
总共 6729 (差异 3584),复用 6684 (差异 3551)
remote: 处理 delta 中: 100% (3584/3584), 完成.
To ssh://127.0.0.1/356x-linux/linux/yocto/meta-rockchip
* [new branch] master -> master
* [new branch] m/linux -> m/linux
* [new branch] rk/alios -> rk/alios
* [new branch] rk/honister -> rk/honister
* [new branch] rk/master -> rk/master
* [new branch] rk/morty -> rk/morty
* [new branch] rk/retrogame -> rk/retrogame
* [new branch] rk/yocto-next -> rk/yocto-next
* [new tag] linux-4.19-gen-rkr2 -> linux-4.19-gen-rkr2
* [new tag] linux-5.10-gen-rkr1 -> linux-5.10-gen-rkr1
* [new tag] linux-5.10-gen-rkr2 -> linux-5.10-gen-rkr2
A-: ssh://git@127.0.0.1/356x-linux/linux/poky
总共 0 (差异 0),复用 0 (差异 0)
To ssh://127.0.0.1/356x-linux/linux/poky
+ b64b0a2132...883341e9ca master -> master (forced update)
+ b64b0a2132...883341e9ca m/linux -> m/linux (forced update)
[1]+ 已完成 gedit ../mirror.sh (工作目录: /build/356x-linux/u-boot)
(当前工作目录:/build/356x-linux)
看到此处代码仓库逆向构建大功能告成。
经不懈努力,repo 逆向工程终于能按照具体方式呈现给各位大佬。世上无难事,只要肯登潘。
以上为 gitolite 代码托管的升级篇。