gitolite – 代码仓库管理

前两文 gitolite 代码仓库基本构建完成,使用中会遇到要新建、删除分支仓库。或者增加外部代码仓库,问题来咯。如何在现有基础上构建新代码仓? 如何在现在代码仓中删除制定目录?如何在同步代码时间 检出制定提交点相关代码?


提示:此文章为逆向构建 gitote 托管代码仓库repo。

文章目录

  • gitolite -- 代码仓库管理
  • Gitolite 托管实现目标
  • 1. gitolite 管理 repo 镜像仓分支管理
    • 1.1 repo 增加 新git仓
    • 1.2 repo 删除远程git仓
  • 2. mainfests 应用
    • 2.1 repo 根据manifests 同步代码
    • 2.2 repo 逆向生成 mirror仓
  • 总结

Gitolite 托管实现目标

a) gitolite 管理 repo 镜像仓增加 git 仓
b) gitolite 管理 repo 镜像仓删除 git 仓
c) repo 同步时检出制定提交点代码
d) Android repo 检出后的源码 逆向生成 repo mirror 仓库


1. gitolite 管理 repo 镜像仓分支管理

Android repo 镜像仓搭建完成后,实际开发过程中会增加新的代码,此时代码不在任何一个git目录下 需新建git仓无疑是最优解。gitolite负责repo mirror仓授权管理,授权时增加一个新git路径配置,再由用户上传源码;新增加git仓就是这么简单。同理想要删除某些仓改写 xxx_repo.conf 配置信息即可。

1.1 repo 增加 新git仓

以 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
* masterremotes/rk/master
#此时新家git仓已成功

1.2 repo 删除远程git仓

gitolite 上”删除“ git仓 更认为是屏蔽某些路径读写权限,获取不到等同于删掉。

cd ~/gitolite-admin
vi conf/rk356x-s.conf
# rk356x-s.conf 仅有想屏蔽的代码仓,以刚添加为例
- 356x-s/rk/hardware/rk29/libgps

2. mainfests 应用

如1.1中增加新git仓后 每次使用sync同步代码时都更新不到,即便全部重新拉取源码也没有,重要原因 repo 初始化的 manifest_xxx.xml 中未包含相关仓库信息。接下来要讲得就是使用 manifests 整理代码。

2.1 repo 根据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提交点的代码 方法同步代码。

2.2 repo 逆向生成 mirror仓

思路一 按照单独建 git 仓方法,逐个建仓然后上传。工作量大、易出错,不明智。
思路一升级 改写脚本批量操作,耗费时间过多 不理想

思路二 参照 gitolite 管理仓方法,逆向生成 xxx.conf 配置信息,由 gitolite 建初始仓;本地代码统一上传到 mirror仓。

  • 生成 xxx.conf 配置信息
# 生成 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
  • gitotlite 添加刚生成的 xxx.conf 配置信息
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-adminRW+     =   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
  • 上传 repo mirror 仓
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-buildb553a085 dl: remove the linux kernel version44eb5692 dl: update packages for chromium7b5eef20 dl: update packages libv4l-rkmpp and opensslca270188 libunwind: Update to 1.5.0e7108d6d qemuu: Update to 5.1.0c7be9fe0 qt5: Add 5.15 packages540d29c4 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"; thenecho A-: ${url/$URLA/$URLB}git remote set-url $origin ${url/$URLA/$URLB}git push $origin --mirror
elif grep -q "$URLB" <<< "$url"; thenecho B-: $urlgit push $origin --mirror
fiexit 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 代码托管的升级篇。

gitolite 搭建Android仓库(三)相关推荐

  1. gitolite 搭建 Android仓库(一)

    gitolite – 搭建授权管理 平时在github上创建仓库.推拉代码.创建 Pull/Merge Request.发起 Issue . 如果是本地代码 git 只能跟踪的代码信息,无法完成如上操 ...

  2. gitolite 搭建Android仓库(二)

    gitolite – 导入 Android 代码镜像仓库 平时在github上创建仓库.推拉代码.创建 Pull/Merge Request.发起 Issue . 如果是本地代码 git 只能跟踪的代 ...

  3. 7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法 7.4 yum工具用法 7.5 yum搭建本地仓库...

    7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法 7.4 yum工具用法 7.5 yum搭建本地仓库 三种方法 rpm工具----->类型windows下的exe程序 ...

  4. 最新jfrog artifactory搭建Android本地仓库教程

    提高gradle编译速度 jfrog artifactory本地仓库搭建 前言 什么是本地仓库 jfrog本地仓库搭建 更改项目仓库地址 解决Received status code 401 from ...

  5. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  6. 安装软件包的三种方法、rpm包介绍、rpm工具用法、yum工具用法、yum搭建本地仓库...

    为什么80%的码农都做不了架构师?>>>    安装软件包的三种方法 rpm工具 yum工具 源码包 rpm rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linu ...

  7. 安装软件包的三种方法 ,rpm包介绍 , rpm工具用法, yum工具用法, yum搭建本地仓库...

    linux安装和卸载软件 安装三种方法 rpm工具 yum工具 源码包 rpm工具使用 首先看一下什么事rpm包,可以挂载光驱看看里面有很多 [root@localhost ~]# mount /de ...

  8. 安装软件包的三种方法、rpm包介绍、rpm、yum工具用法与yum搭建本地仓库

    一.安装软件包的三种方法 rpm工具:RPM包是预先在linux机器上编译好并打包好的文件,安装起来非常快捷.但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当:包与包之间存在着相互依赖的 ...

  9. Android Studio(13)--- Git之使用GitHub搭建远程仓库

    Git之使用GitHub搭建远程仓库 在上一节中,我们学习了如何使用Git,构建我们的本地仓库,轻松的实现了版本控制以及代码还原,修改日志查看等:读者肯定不满足与本地是吧,假如是多个人一起来开发一个程 ...

最新文章

  1. 可覆写的函数与创建节点
  2. 安卓开发之探秘蓝牙隐藏API
  3. activemq nodejs stomp 重连机制_5分钟优劣分析 Kafka、RabbitMQ、RocketMQ、ActiveMQ消息队列...
  4. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
  5. GW48CK/PK2/PK/PK4 系统万能接插口与结构图信号/与芯片引脚对照表
  6. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
  7. webtest 文章
  8. 文本分类模型_【文本分类】几个可作为Baseline的模型
  9. 20200227:存在重复元素Ⅱ(leetcode219)
  10. 使用泛型, 写一个为任意类型的动态数组添加元素的方法
  11. EXCEL VLOOKUP函数的使用(二)
  12. php爬虫亚马逊,亚马逊爬虫(亚马逊 api)
  13. LM2596电路简析
  14. 大数据定价方法的国内外研究综述及对比分析
  15. Adobe Photoshop CC 2018之ps磁性套索工具抠图(☆)
  16. ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)
  17. 发布网站 IIS部署网站
  18. SOA、SOI和SOE
  19. 【C#】线程之Parallel
  20. Windows文件共享服务

热门文章

  1. MIPS 、DMIPS、MFLOPS、TOPS解释
  2. Optimizer类
  3. python中divmod的意思是_Python: divmod的神奇作用
  4. MySQL int 类型长度有啥用? int(11) 和 int(20) 有啥区别?
  5. WPF中DataGrid自动滚动,跑马灯效果实现
  6. 相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)
  7. 浅析电线电缆出现接触不良的原因
  8. 腾讯云轻量应用服务器使用 Cloudreve 应用镜像搭建个人私有云盘!
  9. matlab安装缺少,为什么我的电脑安装matlab时出现找不到 – 手机爱问
  10. 新建逻辑卷, 调整现有磁盘分区, 扩展逻辑卷大小, find查找并处理文件