使用repo、git、gerrit托管android源码

研究android源码的都知道,在下载源码时,都是用repo init ,repo sync等命令去下载源码,repo内部是使用git进行版本控制的,之前没有仔细的了解,只知道跟着source.android.com的教程,当个打字员,然后编译,之后rom就出来了。让我进行这方面的研究的一个trigger是我现在进行的项目,需要对android的framework进行改动,我需要对音频模块进行修改,然后我小弟需要对另外一个模块进行修改,考虑到长久的代码管理及代码备份整合,有必要进行代码托管。之前我一直习惯使用svn,但是android那么庞大的数据量,用svn,再怎么多的硬盘也不够。先前就对git有所耳闻,但一直感觉它是个谜,没有勇气去触碰,趁着这个机会,也想好好学一学。

(1)repo

由于设备的原因,我现在代码都是从Cyanogenmod 上拉取的。根据官方的教程,是从http://github.com/Cyanogenmod/android.git 下载下来的,我之前以为它的代码全都是在那,用浏览器打开下,居然只有两个文件:README.mkdn和default.xml,仔细的看了下它的内容,尤其是default.xml,发现了端倪.

http://github.com/Cyanogenmod/android.git内容

default.xml:

看着default.xml,仔细的跟源码进行对照,发现了其中的奥秘,也终于见识了git的分布式功能:git是个分布式的版本控制软件,它可以让你把代码分布在各个仓库,然后从各个仓库把各个项目取出来,这些仓库可以是你自己的,也可以是别人的。而repo正是对这些仓库进行统一的控制管理的工具。从default.xml,可以看到有标签,表示一个git源,而是从那些源取出来的项目,在可以使用remote指定源,如果没有指定,就从使用定义的源里的path表示下载到android source的目录,name表示从源处获取的项目git仓库位置,revision表示分支版本。如上图,我们可以看到,该版本,从aosp的android-4.0.4_r1.2分支取出device/common项目,放置在android源码根目录的device/common目录下。

repo会从指定的版本仓库里下载里面的default.xml文件,进行解析,然后根据不同的的配置,把项目从分布服务端下载下来,从而形成android的源码,强大吧!

因此,我们可以修改里面的default.xml,更改部分的成自己的版本仓库,便可进行分布式的开发了。自己可以github.com上构建个自己的仓库,进行开发。

repo在管理的时候,会使用gerrit进行Code Review,这个稍后再讲,不过《Git权威指南》的作者有一篇《脱离 Gerrit 审核服务器,使用 repo》,据称可以脱离Gerrit,很惭愧,按照他的教程我没有成功,也不想去深究了,求各路大牛指教。

repo的命令详见:http://source.android.com/source/using-repo.html

(2)git服务端架设

具体git的命令不详细描述了,有几个个人认为好的资源分享下:

《Pro Git》

《看日记学Git》

《Git权威指南》   --- 未读

Git的架设通常需要openssh server, Git, Gitosis, Apache2,我的服务端是ubuntu,这里用了两台机器:

  • Server:表示我的Git服务端
  • Client: 表示我的Git客户端
1、Server上安装Git服务
sudo apt-get install git-core 

2、Server上安装Gitosis
Gitosis是一个工具程序,可以帮助我们进行Git仓库的访问控制和远程管理。
sudo apt-get install python-setuptools
mkdir ~/src
cd ~/src
git clone https://github.com/tv42/gitosis.git

cd gitosis
sudo python setup.py install
PS:需先安装python:  sudo apt-get install python-setuptools

3、为Gitosis创建系统用户
由于是私人团队使用,我个人喜欢用以下方法创建:
sudo adduser git
sudo passwd git
把gitweb的项目设置为/homg/git


4、安装远程管理客户端
安装远程管理客户端,允许Client能通过ssh对Git进行管理。在Client的~/.ssh上执行:
ssh-keygen -t rsa
该命令会产生一对公私钥,然后将公钥复制到Server服务端

scp ~/.ssh/id_rsa.pub git@Server:/home/git
sudo -H -u git gitosis-init < /home/git/id_rsa.pub
然后,会在/home/git/repositories创建仓库目录,并且里面创建了一个管理员仓库,叫gitosis-admin,并且会把id_rsa.pub复制到keydir目录下
修改一个文件的权限(= =具体为啥修改,没具体深究)
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

之后我们便可以再Client端对Git Server进行控制
git clone git@Server:repositories/gitosis-admin.git 
可以通过修改gitosis-admin/gitosis.conf文件来管理Server上的仓库
[group gitosis-admin]  
members [email protected] 
writable = gitosis-admin 
该文件可以创建不同的分组[group],分组有的members 设置不同的成员,然后通知对不同仓库的管理权限,在这里对gitosis-admin有写的权限。

5、添加新用户
当有新用户添加时,可以把他的公钥放在keydir下,并修改gitosis.conf即可,用户名是去掉.pub后缀后的名称。如:我的公钥名称是[email protected],那么我的用户名就是 [email protected]
6、创建新项目
我们想要创建个Git仓库的话,可以在/home/git下创建即可。
cd ~
mkdir sample.git
git --bare init

之后可以再gitosis.conf,修改配置文件,配置权限
[group sample]  
members = [email protected]
writable = sample
members为用户,表示这些用户能够对sample进行写入。

可以通过http://your-server-ip/cgi-bin/gitweb.cgi,查看你当前的Git仓库。

7、ssh rsa认证
我们在Client端执行git clone的时候,经常会提示你输入密码,我在使用github的时候,并不需要密码,网上查了下,原来是github的ssh采用rsa认证的原因,无需输入密码,采用公私钥即可进行操作。出于个人喜好,我自己想在Client端通过rsa认证的方式访问Server。
修改/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile    %h/.ssh/authorized_keys
把Client上传的id_rsa.pub拷贝到 /home/git/.ssh/authorized_keys
cd /home/git
cp /home/git/id_rsa.pub .ssh/authorized_keys
重启ssh服务即可,如果有新的客户端想通过该方式访问Server,把它的rsa公钥拷贝添加到authorized_keys即可。之后我们用ssh登陆或者git clone就无需输入密码进行验证了。Git Server配置完毕。

(3)Gerrit服务端配置
到最头疼的地方了,吐槽下历史:起初压根不知道Gerrit的存在,我在创建自己的仓库管理的时候,拷贝Cyanogenmod,把它的default.xml里Cyanogenmod的review去掉,然后在使用repo upload的时候就报错了,表示木有review,木有Gerrit,代码不让上传,so,repo貌似泡汤了。。
Gerrit是咩东西呢?它是代码审核工具,包括了一套权限系统,我们在使用Git的时候,如果使用git push,是直接提交到到Git仓库的,为了保证代码的质量,Gerrit出现了(= =我YY的),使用Gerrit后,我们代码的提交流程大致如下:我们用git push把代码提交上去之后,要先经过Gerrit的审核,审核通过后才会提交到主线的代码。详细的流程,如下图:


1、gerrit安装
Gerrit安装在Server端,从 http://code.google.com/p/gerrit/ 下载Gerrit,最新版的是2.4,它运行时需要用到数据库,有H2,Mysql,PostgreSQL等,为了方便我就是用H2。由于只是搭建个小型服务器,Authentication method是用http,其它都是默认。
要初始化Gerrit,运行 java -ar gerrit.war init -d /path/to/location会在/path/to/gerrit指定路径上安装Gerrit运行时。然后会弹出一大堆的交互信息,我就只有Authentication method选择http,其它默认。安装完后会弹出浏览器弹出错误界面,提示http请求未带授权头。

2、安装配置apache2
sudo apt-get install apache2
激活代理模块
ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enable/proxy.conf   
  
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enable/proxy.load   
  
ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enable/proxy_http.load  
然后再/etc/apache2/httpd.conf中加入下面的内容(该文件初始为空)
   
  ServerName localhost   
  ProxyRequests Off   
  ProxyVia Off   
  ProxyPreserveHost On   
  
     
        Order deny,allow   
        Allow from all   
     
    
     
     AuthType Basic   
     AuthName "Gerrit Code Review"  
     AuthBasicProvider file   
     AuthUserFile /path/to/gerrit/etc/passwords   
     Require valid-user   
     
  
  ProxyPass / http://127.0.0.1:8080/   
  

这里需要注意2个地方,第一个是/path/to/gerrit/passwords 是用来保存gerrit的用户资料文件,可通过以下命令生成,该命令用来创建gerrit的用户
htpasswd -c /path/to/gerrit/etc/passwords "gerrit_fisrt_username"  (第一次时要加-c,之后就不用了)
这里的gerrit_first_username就是用来登陆的用户名。
第二个是ProxyPass / http://127.0.0.1:8080/,这里的配置要和/path/to/gerrit/etc/gerrit_config里面的
[httpd]   
        listenUrl = proxy-http://127.0.0.1:8080/  
匹配。
配置好后,可以通过浏览器访问 http://127.0.0.1( ATTENTION!!!是80端口!!!),之后会提示用户名密码,输入gerrit_first_username和密码登陆,就会自动转到http://127.0.0.1:8080,。第一个登陆的账户是管理员账户。
在Client端执行命令
ssh -p 29418 gerrit_fisrt_username@your-server-ip



你可能感兴趣的:(使用repo、git、gerrit托管android源码)