原文地址:http://nicekwell.net/blog/20171112/ba-yi-you-de-repogong-cheng-ti-jiao-dao-fu-wu-qi.html
repo是google开发的工具,用来管理多个git工程,最常用在Android源码管理上。
本文介绍的是如何把一个已有的repo工程提交到自己的服务器,在自己的服务器上管理这些源代码,同时保留原来repo组织这些代码仓库的结构。
git的详细使用方法这里不介绍,这里只要知道git服务器端建立git仓库的命令:
git init --bare [仓库名].git
而客户端创建工程、关联远程仓库、第一次提交的方法是:
创建工程:
git init
关联远程仓库:
git remote add origin [远程仓库地址]
第一次提交:
git push -u origin master
repo的详细使用方法这里也不介绍,repo要用到的命令有:
repo init -u [manifest仓库地址]
初始化repo工程,会把manifest.git仓库拖下来。
我们搭建好自己的repo服务器后,也可以使用此命令拖下来自己的repo仓库。
repo sync
同步代码。
搭建好自己的服务器后,用此命令同步时将会从自己的repo仓库同步代码。
这个文件要好好介绍一下,我们将会对这个文件进行解析,解析出各个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的路径、版本、拖下来后的本地路径。
从上面得知,各个子工程的远程和本地路径都保存在manifest.xml文件里,那么我们只要解析这个文件就能获取服务器端和本地的文件结构。
在服务器端解析manifes.xml文件,获取所有git工程的远程路径,在服务器端批量创建这些git工程;
本地解析manifest.xml文件,获取各个git工程的本地路径和远程路径,在本地初始化git工程,并关联、提交到远程。
对于ubuntu:sudo apt-get install python3
后面的脚本基于python3。
客户端是一个已有的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文件记录的各个工程信息是我们需要的,后面会解析此文件,把这个文件复制出来找个地方放一下。
每个repo工程都会有一个 manifest.git 工程,此工程内容就是 manifest.xml 文件,manifest.xml文件记录了各个git子工程的信息。
我们在服务器创建一个 manifest.git 工程就是用于存放我们自己的 repo 工程的manifest.xml文件。
一般放在大工程目录下。
git init --bare /home/git/[工程目录]/manifest.git
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文件即可,脚本不需要提交。
获取到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
脚本执行完成后会新建很多目录出来:
刚刚在服务器上已经创建好了各个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指定路径下。
找一个干净的地方,用 repo init -u [服务端manifest.git地址],
然后 repo sync,此时应该可以同步所有git子工程。