Ubuntu16.04 搭建Android源码的git+gitosis+repo代码管理的服务器

2023-10-29

一份源码 要让团队里的人能够轻松地拉取。

以下是我的搭建过程。

1.关于源码及相关编译环境参考我之前的一篇博文https://blog.csdn.net/qq_28449863/article/details/79978937

2.简单做个描述

所有电脑都处在局域网下。

 一台服务器(UbuntuServer),有几个用户(开发者),另外有一台电脑来管理服务器上的代码(就叫管理员吧)

要做到开发者都能从服务器那拉取代码和更新代码。()

3.先搭好git+repo的简单服务器

具体参考https://blog.csdn.net/qq_28449863/article/details/79992191

4.在此之前请确保上述要求都能满足

最头痛的一步

       接下来的就是怎么把Android的源码弄上去了,我这里是谷歌的Android-7.0.0.0-r32版本的源码。弄下来,以为把所有的源码全丢在一个文件下就行了,所以一开始就在管理员那把所有源码都丢进相当于apps的目录下,然后整个push到服务器。然而事情并不简单,当开发人员拉取代码时很多文件夹里面什么都没有。显然这样是不可取。repo是管理多个git的,源码里面本身就有一些git,并不是纯净的目录,所以在管理员push的时候,有些东西并不能push上去。即使是干净的源码,加之这个源码的量很大几十个G,每次push和pull的时候都把整个都这样操作很不方便,也失去了使用repo的意义,那跟单独使用git没区别。用repo就是为了管理多个git。

  明白了这个就好多了,然后就是来处理这个源码了。分几个步骤。

1.清理源码使之成为纯净的目录(无特别说明都在源码的根目录下执行命令)

copy一份源码的default.xml 在源码的.repo/manifests/目录下,然后删除整个.repo 文件夹

rm -rf .repo

在删除整个目录中所有“.git”“.gitignore”文件

find .  -name ".git" | xargs rm -rf

find .  -name ".gitignore" | xargs rm -rf

执行完这些源代码就是干净的了,没git,没gitignore。

原default.xml(以Android8的一个版本为例,android7的跟它差不多一个样):

对其加以修改,我把那个name属性中的"platform/"路径去掉了(其实做不做这一步应该没关系),这个name对应的就是远程仓库的地址,即服务器上/home/git/repositories/下的仓库位置(只要一致就可以了)。不过替换也挺方便的。这样name跟path路径一致了。path代表本地同步时的本地路径。修改参考:https://blog.csdn.net/doubleface999/article/details/55798741

另外还需要修改下默认远程仓库的地址。根据你自己的来(一般替换为你服务器的ip地址即可)

将其保存为default.xml(以后会用的这个xml文件,很重要)

2.在gitosis系统中添加仓库组(这是能够在管理员那关联远程仓库并push上去的前提)

把修改后的default.xml和python脚本文件拷贝到管理员的gitosis-admin目录下,赋予脚本执行权限

脚本文件:gitosis.py

#!/usr/bin/python3
#把出现的git加入到gitosis系统中
import os
import sys

if len(sys.argv) == 1:

    print('错误!请传入 xml 文件')

elif len(sys.argv) == 2:
    print('错误!请传入 conf文件)

elif len(sys.argv) > 3:
    print('错误!传入参数太多')
else:
    print('传入的文件是 %s,%s' % (sys.argv[1],sys.argv[2]))

#newfilestr = ''
    
with open(sys.argv[1], 'r') as fin:
    while True:
        linestr = fin.readline()
        if linestr == '':       #表示文件结束
            break
        #print(linestr)
        #下面开始对本行内容分析
        if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)):   #本行内容含有name信息
            #print(linestr)
            #下面分析本行内容,并提取name
            charistr1 = 'name="'
            charistr2 = '"'
            gitprojstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
            gitdir=os.path.split(gitprojstr)[0]
            gitname=os.path.split(gitprojstr)[1]
            print(gitdir)
            print(gitname)
            with open(sys.argv[2], 'a') as fout:
                fout.write(' '+gitname)

修改前:

使用python脚本:

./gitosis.py default.xml gitosis.conf

修改后(脚本执行完,请手动修改一下gitosis.conf ,脚本添加的目录是另起一行添加的,务必把其改成以下形式,其中writeable 有多个路径<以空格隔开的>,每个路径代表一个.git目录,即在服务器上/home/git/repositories/下的仓库位置)

然后删掉之前添加的default.xml和gitosis.py

再add commit提交到远程,git push,更新gitosis配置。

3.初始化源码,并与远程仓库关联,提交后push。

把修改后的default.xml和脚本文件getnames_and_init_push_git_proj.py复制到之前处理过的干净源码目录下,并赋予脚本执行权限

getnames_and_init_push_git_proj.py内容如下:

#!/usr/bin/python3

import os
import sys

remote = 'git@192.168.1.107:'#注意更改远程仓库地址

if len(sys.argv) == 1:
    print('错误!请传入 xml 文件')
elif len(sys.argv) > 2:
    print('错误!传入参数太多')
else:
    print('传入的文件是 %s' % sys.argv[1])

with open(sys.argv[1], 'r') as fin:
    while True:
        linestr = fin.readline()
        if linestr == '':       #表示文件结束
            break
        #print(linestr)
        #下面开始对本行内容分析
        if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)):   
            #本行内容含有name信息
            #print(linestr)
            #先无条件提取name路径
            charistr1 = 'name="'
            charistr2 = '"'
            namestr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
            if 'path=' in linestr:            #如果path存在则用path的路径作为本地路径
                charistr1 = 'path="'
                charistr2 = '"'
                pathstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
            else:                             #如果path不存在,则认为path路径(本地路径)就是name路径
                pathstr = namestr
            print('name="%s", path="%s"' % (namestr, pathstr))
            #下面开始初始化并提交git工程
            localpath = sys.path[0] + '/' + pathstr        # git工程的本地绝对路径
            #remotepath = remote + '/' + namestr            # git工程远程相对路径
            remotepath = remote + namestr+'.git'            # git工程远程相对路径,注意要与gitosis.conf 配置的路径一致
            print(remotepath)
            #判断本地目录是否为空,为空的话则新建一个文件,空目录会导致git提交失败
            if not os.listdir(localpath):       # 本地目录为空
                #cmd = 'touch %s/._USELESSFILE_' % (localpath)
                cmd = 'touch %s/.gitignore' % (localpath)
                print(cmd)
                os.system(cmd)
            
            cmd = 'cd %s && rm -rf .git && git init && git remote add origin %s && git add . -f && git commit -m "init" &&git push -u origin master && cd %s' % (localpath, remotepath, sys.path[0])
            print(cmd)

            os.system(cmd)

 

执行脚本文件:./getnames_and_init_push_git_proj.py  default.xml

等待。。。(此时就会在相应的目录下初始git,提交,关联指定的远程仓库,push上去)

直至命令执行完毕。

4.更新manifest.git(用于控制repo init时拉取哪些git)

将更新后的default.xml 复制到管理员的manifest目录下提交到远程服务器,更新manifest.git。

5.用户测试

  现在关于安卓源码的repo服务器的就搭好了。

gitosis系统中的其他用户就可以拉取代码,这目录会就有真东西了,不像之前什么都没有。

先安装repo工具:

 

mkdir ~/bin
PATH=~/bin:$PATH

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo

chmod a+x ~/bin/repo

修改repo文件内容中的 export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

 

mkdir adnroid7 && cd android7

 

repo init -u git://192.168.1.107/manifest.git -m default.xml

repo sync

repo init 中的 -m是指定相应的配置文件,根据这个配置文件来拉代码,默认为default.xml。所以上述-m也可以略去。当你的配置文件名不是default.xml时就需要加上这个 -m参数了

关于脚本的参考:http://nicekwell.net/blog/20171112/ba-yi-you-de-repogong-cheng-ti-jiao-dao-fu-wu-qi.html

注:当repositories目录下需存在多个项目时,且项目之间有重名的git,会产生重叠冲突。此时可通过在repositories目录下新建对应的项目来存储相应的git项。如:yota项目

在初始化和提交脚本中修改远程根地址为:remote = 'git@192.168.1.110:yota/'

default.xml 修改 

  <remote fetch="git://192.168.1.110:/yota/" name="msm8953_remote"/>
  <default remote="msm8953_remote" revision="refs/heads/master" sync-j="4"/>

fetch用这种绝对地址比较稳妥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu16.04 搭建Android源码的git+gitosis+repo代码管理的服务器 的相关文章

随机推荐

  • 20230901-文件保存

    文件保存 cpp文件 include widget h include ui widget h include
  • qt之操作鼠标 可控制鼠标连击 双击 定点点击 鼠标点击脚本等

    一 前言 一直想做一个鼠标连点器 但在网上照片各种鼠标点击软件 均不符合要求 要么收费 要么不好用 要么不好使 于是乎就想起自己会写程序 为何自己能动手非要吵吵呢 于是乎就着手去新建qt工程开始干 在qt文档里找了mouse类的api函数
  • 这款 AI 工具几分钟即可为品牌设计出高端产品图片? #Flair AI

    自动生成品牌所需的营销素材 这款 AI 工具的性能有多强大 Flair AI Flair AI 是一个品牌内容的 AI 设计工具 能够给品牌生成高质量的营销素材 根据用户的描述 自动创建出适合 CPG consumer packaged g
  • C++STL总结笔记(一)—— 容器和容器适配器

    文章目录 前言 一 概念 1 1 顺序容器 1 2 容器适配器 1 3 关联容器 二 程序示例 1 vector和Set自定义数据类型的访问 2 vector容器嵌套 3 list容器排序 4 pair对组的使用 总结 前言 STL是C 中
  • 【案例 5-4】字符串转换为二进制

    Test类 package anli5 4 字符串转换为二进制 import java util Scanner public class Test public static void main String args Scanner s
  • Spring Cloud的负载均衡Spring Cloud Ribbon和Spring Cloud Feign

    一 客户端负载均衡 Spring Cloud Ribbon Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具 它是基于Netflix Ribbon实现的 通过Spring Cloud的封装 可以轻松地将面向服务的
  • 如何看懂源代码--(分析源代码方法)

    由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪 可是这个速度本人表示非常不满意 先去找了下资料 觉得不错 摘自 繁体中文Traditional Chinese http www ithome com tw i
  • HT for Web (Hightopo) 使用心得(7)- 3D场景环境配置(阴影,灯光,环境光)

    在文章 Graph3dView 环境配置 天空球 雾化 辉光 景深 中 我们介绍了在 3D 场景中的一些环境配置 包括天空球 雾化 辉光 景深等 本篇文章我们继续补充其他的环境参数 阴影 灯光 环境光 由于本人缺乏艺术细胞 文章中配置的环境
  • vue 实现抽奖大转盘

    实际解决需求 前端只是负责页面转动 在用户点击时 请求中奖接口 同同时通过设置css属性 让转盘转动起来 当转盘转动结束后 根据请求后端接口回来的中奖信息 设置转盘的转动位置 然后进行弹窗显示中奖信息 在此时 注意要重置转盘的转动角度为初始
  • python组成结构_[Python入门学习]-Python项目的组织结构

    一 工程结构 二 编码规范 1 命名规范 包 使用小写字母命名 如果有多个单词 则用下划线分隔 正确的命名方式 lower with under 模块 使用小写字母命名 如果有多个单词 则用下划线分隔 正确的命名方式 lower with
  • Notepad++ 下载

    1 输入下载网址 https notepad plus plus org 2 点击download 3 开始下载安装包 下载好双击下面 跟着向导完成 在此处点击需要创建快捷方式 然后点安装 完成安装的效果
  • 排序算法系列1--简单排序(选择,冒泡,直接插入,希尔排序)

    排序是数据处理中十分常见的操作 现代高级语言都有现成的n种排序算法 但了解它们的代码 对计算机思维有帮助 简单选择排序 每一趟从待排序的数据元素中选择最小 或最大 的一个元素作为首元素 直到所有元素排完为止 简单选择排序是不稳定排序 无论数
  • Mysql数据库迁移:善用Navicat工具,事半功倍

    数据库迁移 在说到数据库迁移方面 像很多开发工作一样 简单有简单的做法 复杂有复杂的做法 就看怎么做了 那么什么样子的数据库迁移方式才是最优的 在这里是没有准确的定义的 但是我这边分享一个比较简单而言的数据库迁移方案 一 迁移方案描述 例如
  • Linux 别名的设置与修改

    装了个 Ubuntu 在终端下 输入 ll 将全部文件显示出来了 由于平时工作中使用的 suse 系统下 输入 ll 时是不会显示隐藏文件的 文件名前面带 的文件 而且一般很少使用隐藏文件 习惯问题 不希望它显示隐藏文件 打算改改 在终端下
  • STM32-基本知识梳理8-FATFS文件系统移植

    一 基本概念 1 为什么需要文件系统 在没有文件系统的存储器中 一般通过手工记录 那些变量存放在那些位置 很难有系统的管理 难以记录有效数据的位置 难以确定存储介质的剩余空间 不明确应以何种格式来解读数据 加入文件系统后 就可以引导区 目录
  • 运输层 :UDP用户数据报协议

    1 相关概念 UDP数据包产生 上层应用产生数据 但是这与真正发送的IP数据报数量并没有什么联系 并且UDP报文并不是一种可靠的协议 我们必须关注IP数据报的长度 如果超过MTU 在链路层的一种限制 则应该进行分片 2UDP报文 16位源端
  • c++ new与delete与qt内存回收机制

    在c primer中读到 new 是在堆里面申请一段内存资源 new必须与delete成对使用 否则就会造成内存泄漏 可最近学qt 我经常可以看见只new而不delete的情况 是不是这样就内存溢出了 非也 百度了一下qt的内存管理机制 才
  • Qt使用数组实现控件批处理

    Qt使用数组实现控件批处理 在Qt中 当你需要对多个控件进行批处理操作时 使用控件数组会大大简化你的代码量 例如希望在一个页面中创建一个控件数组 其中包含8条控件集合 控件数组的定义如下 QCheckBox checkbox 8 QLabe
  • 微机原理课堂练习五

    练习五 定时计数器 和A D D A转换 一 选择题 在下列每小题的四个备选答案中选出一个正确的答案 并将其字母标号填入括号内 24分 1 某一测控系统要用一脉冲信号产生单稳信号 如果使用8253可编程定时 计数器来实现此功能 则8253应
  • Ubuntu16.04 搭建Android源码的git+gitosis+repo代码管理的服务器

    一份源码 要让团队里的人能够轻松地拉取 以下是我的搭建过程 1 关于源码及相关编译环境参考我之前的一篇博文https blog csdn net qq 28449863 article details 79978937 2 简单做个描述 所