(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,可以看到有<remote><project>标签,<remote>表示一个git源,而<project>是从那些源取出来的项目,在<project>可以使用remote指定源,如果没有指定,就从<default>使用定义的源<project>里的path表示下载到android source的目录,name表示从源处获取的项目git仓库位置,revision表示分支版本。如上图,我们可以看到,该版本,从aosp的android-4.0.4_r1.2分支取出device/common项目,放置在android源码根目录的device/common目录下。
repo会从指定的版本仓库里下载里面的default.xml文件,进行解析,然后根据不同的<remote>和<project>的配置,把项目从分布服务端下载下来,从而形成android的源码,强大吧!
因此,我们可以修改里面的default.xml,更改部分的<project>成自己的版本仓库,便可进行分布式的开发了。自己可以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客户端
sudo apt-get install git-core
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
sudo adduser git
sudo passwd git
4、安装远程管理客户端
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
git clone git@Server:repositories/gitosis-admin.git
可以通过修改gitosis-admin/gitosis.conf文件来管理Server上的仓库
[group gitosis-admin]
members =emos@emos.com
writable = gitosis-admin
该文件可以创建不同的分组[group],分组有的members 设置不同的成员,然后通知对不同仓库的管理权限,在这里对gitosis-admin有写的权限。
cd ~
mkdir sample.git
git --bare init
之后可以再gitosis.conf,修改配置文件,配置权限
[group sample]
members = emos@emos.com
writable = sample
members为用户,表示这些用户能够对sample进行写入。
可以通过http://your-server-ip/cgi-bin/gitweb.cgi,查看你当前的Git仓库。
7、ssh rsa认证
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配置完毕。

1、gerrit安装
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中加入下面的内容(该文件初始为空)
<VirtualHost *>
ServerName localhost
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location /login/>
AuthType Basic
AuthName "Gerrit Code Review"
AuthBasicProvider file
AuthUserFile /path/to/gerrit/etc/passwords <!-- /path/to/gerrit为gerrit目录 -->
Require valid-user
</Location>
ProxyPass / http://127.0.0.1:8080/
</VirtualHost>
htpasswd -c /path/to/gerrit/etc/passwords "gerrit_fisrt_username" (第一次时要加-c,之后就不用了)
这里的gerrit_first_username就是用来登陆的用户名。
[httpd]
listenUrl = proxy-http://127.0.0.1:8080/
匹配。
ssh -p 29418 gerrit_fisrt_username@your-server-ip