您的位置:首页 > 其它

把已有的repo工程提交到服务器

2017-11-14 20:50 169 查看
原文地址:http://nicekwell.net/blog/20171112/ba-yi-you-de-repogong-cheng-ti-jiao-dao-fu-wu-qi.html

      repo是google开发的工具,用来管理多个git工程,最常用在Android源码管理上。

  本文介绍的是如何把一个已有的repo工程提交到自己的服务器,在自己的服务器上管理这些源代码,同时保留原来repo组织这些代码仓库的结构。


一、基础知识


1、git

  git的详细使用方法这里不介绍,这里只要知道git服务器端建立git仓库的命令:

   
git init --bare [仓库名].git


  而客户端创建工程、关联远程仓库、第一次提交的方法是:

  创建工程:

  git init

  关联远程仓库:

  git remote add origin [远程仓库地址]

  第一次提交:

  git push -u origin master


2、repo

  repo的详细使用方法这里也不介绍,repo要用到的命令有:

  repo init -u [manifest仓库地址]

  初始化repo工程,会把manifest.git仓库拖下来。

  我们搭建好自己的repo服务器后,也可以使用此命令拖下来自己的repo仓库。

  repo sync

  同步代码。

  搭建好自己的服务器后,用此命令同步时将会从自己的repo仓库同步代码。


3、manifest.xml文件

  这个文件要好好介绍一下,我们将会对这个文件进行解析,解析出各个git仓库的服务器地址、本地路径,并根据解析的结果创建和同步这些git仓库代码。

1、开头会定义remote



  可以设置多个remote地址,用后面的name区分。

  后面可以选择使用哪一个remote地址。

2、指定默认参数



   remote=”” 来指定使用哪一个remote地址。

   revision 指定分支,从remote地址拖工程时指定拖哪个分支。

   sync -j 指定同步线程数

3、后面一大堆内容都是指定远程工程路径,以及拖下来的位置

  瑞芯微的文件:



  android原生文件:



  path:本地相对路径,可以不指定,不指定的话表示和name相同。

  name:远程相对与remote地址的路径。

  version:

  groups:

  upstream:

  这里的每个name就代表一个git子工程,整个android工程有很多个git子工程组成,这里指定了各个子工程相对于remote的路径、版本、拖下来后的本地路径。


二、把已有的repo工程提交到自己的服务器

  从上面得知,各个子工程的远程和本地路径都保存在manifest.xml文件里,那么我们只要解析这个文件就能获取服务器端和本地的文件结构。

  在服务器端解析manifes.xml文件,获取所有git工程的远程路径,在服务器端批量创建这些git工程;

  本地解析manifest.xml文件,获取各个git工程的本地路径和远程路径,在本地初始化git工程,并关联、提交到远程。


1、客户端和服务端都安装python3

  对于ubuntu:sudo apt-get install python3

  后面的脚本基于python3。


2、客户端准备一个干净的工程

  客户端是一个已有的repo工程,先准备好干净的代码准备提交,执行以下步骤:

  1、.repo/repo/repo sync

  2、删掉所有的.git目录

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


    因为待会会重新初始化这些git工程,所以以前的git信息不需要了。

  3、复制出.repo/manifest.xml文件,删除.repo目录

    repo工程里都会有一个.repo目录,此目录不再需要,但manifest.xml文件记录的各个工程信息是我们需要的,后面会解析此文件,把这个文件复制出来找个地方放一下。


3、服务器端创建manifest.git工程

  每个repo工程都会有一个 manifest.git 工程,此工程内容就是 manifest.xml 文件,manifest.xml文件记录了各个git子工程的信息。

  我们在服务器创建一个 manifest.git 工程就是用于存放我们自己的 repo 工程的manifest.xml文件。

  一般放在大工程目录下。

  
git init --bare /home/git/[工程目录]/manifest.git


4、客户端修改并上传manifest.xml文件

  1、把刚刚创建的manifest.git工程拖下来

    git clone git@[ip]:[proj]/manifest.git

  2、把已有的repo工程里的manifest.xml文件复制过来,并重命名为default.xml

    就是前面删除本地.repo目录时备份的manifest.xml文件。

  3、修改default.xml里面的remote地址,改成新的服务器地址,分支改成master



    注意地址格式写法,只有最后一行的写法是正确的。

    添加新地址后,后面的default配置也要改,remote改成新添加的地址,revision改成master(我们将要保存的分支是master)。

  4、用脚本去掉default.xml里面的version等信息

    默认的xml文件的工程可能带有一些remote、version信息,以后我们放在服务器都是在服务器的master上,这些信息需要清除。



    用这个脚本:del_remote_version.py

    把这个脚本复制到manifest.git工程目录,然后执行这个脚本:

    ./del_remote_version.py default.xml

    此脚本会查找default.xml文件中的 remote、revision、upstream信息,并删除。执行后文件如下:



  5、提交manifest工程

    只需要提交default.xml文件即可,脚本不需要提交。


5、服务端分析manifest.xml文件,批量创建工程

  获取到manifest.xml文件的所有name信息(代表所有git子工程),然后用脚本批量创建git工程。

  1、把上面的default.xml文件用scp上传到服务端,放到工程目录下。

  2、进入大工程目录,用 getnames_and_create_project.py 脚本分析 default.xml文件,并创建工程:

    用这个脚本:getnames_and_create_project.py

    ./getnames_and_create_project.py default.xml



    脚本执行完成后会新建很多目录出来:




6、客户端分析manifest.xml文件,批量上传到服务器

  刚刚在服务器上已经创建好了各个git子工程,这里把它们上传。

  分析manifest.xml文件,获取到所有name信息(代表所有git子工程),然后用脚本批量上传git子工程。

  1、进入上面创建好的干净的工程目录,把上面建立好的default.xml文件复制到这里。

  2、把客户端的id_rsa.pub加入到服务端的 authorized_keys里。

  3、进入大工程目录,客制化以下脚本:

    getnames_and_init_push_git_proj.py



    修改这里的远程地址,后面会把工程提交到这里。

    这里的地址应当和上面服务器端建立工程的地址相同。

  4、运行脚本

    ./getnames_and_init_push_git_proj.py default.xml

    此脚本会解析default.xml里的name和path,

    会先分析本地path是否为空目录,如果是空目录的话则会创建一个“.gitignore”文件,防止空目录提交失。

    然后初始化本地path路径的代码,作为git工程提交到服务器端的name指定路径下。


7、测试

  找一个干净的地方,用 repo init -u [服务端manifest.git地址],

  然后 repo sync,此时应该可以同步所有git子工程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  repo git