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

1.png
  可以设置多个remote地址,用后面的name区分。
  后面可以选择使用哪一个remote地址。

2、指定默认参数

2.png
   remote=”” 来指定使用哪一个remote地址。
   revision 指定分支,从remote地址拖工程时指定拖哪个分支。
   sync -j 指定同步线程数

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

  瑞芯微的文件:

3.png

  android原生文件:

4.png
  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

5.png

    注意地址格式写法,只有最后一行的写法是正确的。
    添加新地址后,后面的default配置也要改,remote改成新添加的地址,revision改成master(我们将要保存的分支是master)。

  4、用脚本去掉default.xml里面的version等信息
    默认的xml文件的工程可能带有一些remote、version信息,以后我们放在服务器都是在服务器的master上,这些信息需要清除。

6.png

    用这个脚本:del_remote_version.py

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

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

7.png

  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

8.png

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

9.png

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

10.png

    修改这里的远程地址,后面会把工程提交到这里。
    这里的地址应当和上面服务器端建立工程的地址相同。

  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子工程。


本站所有文章欢迎转载,但请保留作者信息和原文地址。

Comments