将现有源码添加进repo管理

适用于大型项内无源码管理(git/repo)的源码

前言



公司在进行一些项目的开发时,从供应商原厂给的code内没有包含任何源码管理的文件。需要多人协同开发,但由于项目较大,用git管理效率较低,遂总结出此篇文章供大家参考,也是对我踩坑的记录。

​ 第一次发技术博客,如有说错的地方或者有疑问欢迎各位大佬提出

一,repo介绍与安装

1.repo 是什么

Repo是谷歌用Python脚本写的调用git的一个脚本,可以实现管理多个git库

Repo实现了很多功能,比如repo init ,repo sync,repo forall等等,如果还不了解的大锅去详细了解下。

2.repo的安装

​ 关于repo的安装,我是编写了一个linux shell脚本,省的还要去终端上去敲,具体如下:

#!/bin/sh

mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo export PATH=~/bin:$PATH
echo "export PATH=~/bin:$PATH" >> ~/.bashrc export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'" >> ~/.bashrc

​ 将上面复制下来保存,并且给它加上可执行权限,运行即可。

​ 如果不确定有没有装上?可以运行

which repo

​ 看看是不是你的home目录下的

​ 上面这种就可以了,done~

二,新建项目git仓库

1.获取路径文件

​ 在新建仓库前,需要确定你需要在项目内的哪些地方新建仓库,如果不知道,则需要自己一个个的确定,或者去找到原仓库内的project.list文件,后面需要利用这个项目内拟创建git的路径。

如果找不到project.list文件,只能找得到default.xml文件,则需要使用cat+awk等命令去把xml中的path路径给过滤出来了,关于这个描述repo仓库的文件内语法具体是什么规则请点击喊你夺我一下

ps:(实际xml文件中name才是repo仓的git目录,此处为了方便后面的脚本操作使用path,不影响)

类似的路径文件如下(文后所提到的路径文件皆是指此文件):

2.服务器新建git仓库

​ git管理账号内操作gitolite,利用路径文件编辑gitolite-admin/conf下的gitolite.conf文件:

添加并上传,gitolite工具会通过钩子程序自动新建所有仓库

git add -A && git commit -m "创建项目仓库"
git push origin master

三,客户端上传代码

1.编写一键上传shell脚本

此处也是利用的脚本一键上传,如下:

#!/bin/sh

pause(){
echo $1
echo "exec fail!!!"
exit 1
} PRO_DIRS=$1 PROJECT_PATH=你的服务器代码路径(绝对地址)
PRO_REPO_DIR=此项目服务器repo主目录,类似(git@localhost:项目主目录)只需要写项目主目录名称即可,因为访问gitolte会自动在~/repositories下找 echo "cd $PROJECT_PATH"
cd $PROJECT_PATH || pause parent_path=`pwd`
echo "dir:"$parent_path
##标号计数,方便定位是哪个地址出错了,后续手动维护
NUM=0 ##成功计数
CNT=0 while read dir; do NUM=`expr $NUM + 1`; if test -d $dir
then cd $parent_path/$dir || pause "cd $parent_path/$dir" ##新建空仓库
git init || pause "git init" ##添加此目录内所有文件
git add -A || pause "git add -A ..." ##提交
git commit -m "init commit" || pause "git commit -m "init commit" ..." ##添加远端地址
git remote add origin $PRO_REPO_DIR/$dir.git || pause "git remote add origin $PRO_REPO_DIR/$dir" ##上传进分支
git push origin master || pause "git push origin master ..." echo "line:$NUM $dir init repositories ok!!!" CNT=`expr $CNT + 1`; cd $parent_path || pause "cd $parent_path" continue
else
echo "line:$NUM $dir is not exists!!!"
fi
done echo "successful init count: $CNT" echo "check done!!" exit 0

保存并赋予执行权限

repo_update.sh

2.运行脚本

  • 可以删减些执行功能,先确定路径文件内哪些文件夹存在,根据需要哪些需要新建。

  • 运行此脚本前一定要确定路径文件与实际拟创建的仓库地址一致,否则后续不太好操作。

cat 路径文件 | ./repo_update.sh

等进度吧,巴拉巴拉。

~~

所有都完成后,repo仓库就新建成功了,但是:

我们还缺少repo仓库需要的manifest文件

三.客户端编辑manifest文件

老规矩,还是脚本

1.编辑一件生成manifest文件脚本

这个脚本和一键上传差不太多

#!/bin/sh

pause(){
echo $1
echo "exec fail!!!"
exit 1
} PRO_DIRS=$1 parent_path=`pwd`
echo "dir:"$parent_path NUM=0
CNT=0 MANIFESTS_FILE=$parent_path/default.xml
PROJECT_DIR=项目源码目录绝对路径,验证有效性用 ##write head
echo "write head.."
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<manifest> <remote name=\"repo仓库名字\"
fetch=\".\"
review=\"gitmngr@localhost git地址\" />
<default revision=\"master分支\"
remote=\"repo仓库名字\"
sync-j=\"8\" />
">$MANIFESTS_FILE echo "write project path and neme..."
while read dir; do NUM=`expr $NUM + 1`; if test -d $PROJECT_DIR/$dir
then
CNT=`expr $CNT + 1`;
echo "<project path="\"$dir\"" name="\"$dir\"" />">>$MANIFESTS_FILE
continue
else
echo "line:$NUM $dir is not exists!!!"
fi
done echo "write tail.."
echo " </manifest> ">>$MANIFESTS_FILE echo "write count: $CNT" echo "write done!!" exit 0

2.运行脚本

cat 路径文件 | ./generate_manifest.sh

执行成功后会在当前目录生成一个default.xml文件

检查这个xml文件,查看哪些需要linkfile属性和copyfile属性,这些属性是在你repo sync时,会对应的执行拷贝和链接动作的,我们项目源码根目录内的文件就是从其他地方链接/拷贝过来的,否则可能后续repo sync差文件或者编译出错(重要,非常重要)

2.克隆manifest文件仓库

git clone git@xxxxxxx:项目/manifests.git

3.上传文件

将生成后并修改过的default.xml文件放入这个克隆的目录内,然后,上传:

git add -A && git commit -m "init commit manifests"
git push

OK~差不多了,开始测试我们的结果了。

四.测试我们的repo 仓库

我们在客户端新建一个文件夹,进入内运行:

repo init -u git@xxxxxxx:项目/manifests.git

大功告成~进入漫长的等待吧,然后收获喜悦


码字不易,转载请注明~

将现有源码添加进repo管理的更多相关文章

  1. 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

    本文由作者FreddyChen原创分享,为了更好的体现文章价值,引用时有少许改动,感谢原作者. 1.写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间.今天终于从公司离职了, ...

  2. eclipse导入已有源码

    http://blog.csdn.net/scruffybear/article/details/1917301 如有转载,请注明出处,并保持文章的完整性,谢谢! 最近工作之余在研究国外经典书籍< ...

  3. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  4. Git和Repo管理使用简要介绍

    在Linux平台下进行Android系统项目开发时,需要Git或repo管理. 一. Git和Repo的区别: 1. Git:Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的 ...

  5. Git和Repo管理使用

    Git和Repo管理使用简要介绍 http://blog.csdn.net/stevenhu_223/article/details/8828130 多仓库代码管理器Repo的安装,使用以及服务器搭建 ...

  6. Robotium测试没有源码的apk--需重签名apk

    Robotium是基于Instrumentation框架的,其编写的测试脚本与被测程序运行在同一个进程里面,所以这需要测试程序与被测程序拥有相同的签名,否则无法进行通讯.在只有apk的情况下可以采用“ ...

  7. 用Repo管理自己的本地仓库

    AOSP使用Repo工具管理项目源码.而Repo工具则依赖一个名叫manifest的git仓库来记录Android源码中都包含哪些子仓库. 进入Android源码根目录下的.repo目录,可以看到ma ...

  8. 为没有源码的DLL文件添加强名称

    为没有源码的DLL文件添加强名称 如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed ...

  9. HashMap封装的数据用循环快速添加进list中产生的数据集全部相同的问题

    一.问题概述 在一次使用SimpleAdapter时,Data需要使用传入一条数据(Image.Text),该数据条使用HashMap封装.在用HashMap封装的数据用循环快速添加进list中产生了 ...

  10. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

随机推荐

  1. Gitea v1.17.0 正式发布 | 集成软件包管理器、容器镜像仓库

    我们自豪地宣布 Gitea v1.17.0 发布了.本次发布带来了诸多新特性和累积的更新,我们强烈建议用户在更新到最新版本之前仔细阅读发行注记. 在 1.17.0 版本的开发中我们一共合并了 645 ...

  2. MySQL DDL执行方式-Online DDL介绍

    1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...

  3. 获取 Docker 容器的 PID 号

    # 获取容器的 CONTAINER ID docker ps -q 5354ce7e85e1 # 通过 docker top 获取 PID docker top 5354ce7e85e1 UID PI ...

  4. Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)

    文章转载自:https://blog.csdn.net/BigData_Mining/article/details/88849696 基于角色的访问控制(Role-Based Access Cont ...

  5. SQL的事务

    一.基本概念 事务是数据库区别于文件系统的重要特性之一,当有了事务,就可以让数据库始终保持一致性,同时可以通过事务的机制恢复到某个时间点,保证了提交到数据库的修改不会因为系统崩溃而丢失: 事务只是一个 ...

  6. 我公司是属于生产制造业,最近考虑实施ERP,生产制造业的ERP那家比较好?

    直接告诉你用哪家ERP,那我就太不负责任了,不同企业的规模选用不同的系统,匹配很重要!比如你大型企业,业务管理都比较标准规范,变化性也不大,不差钱预算没问题(千万元起步),你可以考虑下头部厂商.但如果 ...

  7. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

    题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  8. RNN自学理解(一)

    RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,利用了RNN的这种能力,使深度学习模型在解决语音识别.语言模型.机器翻译以及时序分析等NLP领域的问题时有所突破. 参考文献1 ...

  9. 【python】Ubuntu中多条命令的运行

    在模型训练时,往往需要消融实验,通常都是在一个程序运行结束后才再次手动运行下一个,不及时在电脑前可能无端浪费时间,因此需要让程序自动一个接一个去执行.受此启发,特了解了Ubuntu中多命令运行的内容. ...

  10. 论文解读(GGD)《Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with Group Discrimination》

    论文信息 论文标题:Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with ...