Archive for 2012年1月

GIT 源管理设定 (From SVN to GIT)

年底的时候常常不在公司的网络内,再次让我感受了SVN的局限,每次有东西要么都全部在自己的本本里面积攒着,等什么时候进了公司的网络去checkin,要么就专门为了检查code而进入公司网络。加之年底公司实行心的安全要求,不能好像从前那样直接几个密码就进vpn了,还要用硬件的RSA动态钥匙(麻烦加之麻烦)所以最终决定转换到GIT好了(其实好久之前就想转git了,不过一直在偷懒)

首先是给自己一个清单:

1)服务器: CENTOS 5.7

2)服务器现有:svn + trac

3)svn 中现有 project: 71

4) 架设 git + gitweb

5) 所有的 project 都要直接移植过去(包括所有的log,commit,branch)

6) git 提供:readonly 的 http 跟 git 的权限,commit权限走ssh

7) 因为之前是apache跑trac,所以还有一些我自己的python的code写的网页,全部需要保留。
开始之前,我首先在我自己的机器里面把所有的svn下面的project都update了一下,然后关闭服务器上的svn,这样设定期间就没有东西可以commit back回服务器了。
为了便于安装,我直接用rpmforge这个源里的git(也可以自己从source安装)

 

1. 安装rpmforge的源

http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

 

2. import GPG key

rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt

 

3. 用gpg的key来检查下载包裹的完整性

rpm -K rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

4. 安装sourcefroge的源

sudo rpm -i rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

5. 安装所需要的套件: git, gitweb (网页), httpd (apache), git-daemon (gti 协议的 xinetd 启动)

sudo yum install git-all gitweb httpd git-daemon

6. 创建一个新的 git的用户:

sudo adduser git

7. 设定我自己的帐号到加入git的组,这样我自己可以commit

sudo usermod -G git -a rli

8. 创建git源的目录,我放在/var/lib/git 这个是redhat的default的git源的地方

sudo mkdir -p /var/lib/git

chown git.git /var/lib/git

9. 下面的动作已经不需要root了,更改用户到 git (之前创建的)

sudo su -l git

10. 创建一个随便的repo用来测试安装

mkdir /var/lib/git/test

cd /var/lib/git/test

git init –bare –share

上面的git init给了两个选项,一个是–bare这个就是建立一个空的repo,另外一个是–share这样所有的commit会自动继承本身repo的权限

11. 现在git的repo就已经做好了,就这么简单,可以用ssh来测试一下

cd /tmp

git clone rli@localhost:/var/lib/git/test

这里我们会看到test这个project会被checkout出来

12. 增加http的public access, 首先要enable一个post-update的hook

mv /var/lib/git/test/hooks/post-update.sample /var/lib/git/test/hooks/post-update

cd /var/lib/git/test

用 git update-server-info 来update以下gitweb所需要的文件

git update-server-info

可以随便给这个project一个介绍

echo “git test empty project” > description

13. 设定http来服务git的http checkout, url的path是可以随便给的,我这里给的名字是gitsource,所以就设定一个新的conf文件在/etc/httpd/conf.d/下面

sudo vim /etc/httpd/conf.d/gitsource.conf

Alias /gitsource /var/lib/git
<Directory /var/lib/git>
Order allow,deny
Allow from all
</Directory>
上面的设定什么都没有,就是说http://xxxxxxx/gitsource这个rul会去/var/lib/git里面找文件,http允许任何的地址访问(Allow from all)

设定好重新启动以下httpd

sudo service httpd restart

同时不要忘记设定httpd为开机启动

sudo chkconfig httpd start

 

14. 检查以下我们新设定的http源是否工作

cd /tmp/

rm -rf test

git clone http://localhost/gitsource/test

上面会看到checkout一个空的test的project出来

 

15. 增加git的协议,sourceforge的git rpm已经做好的xinetd的启动文件,只要开启就好了

sudo chkconfig git on

如果xinetd是已经启动的(这个看服务器而定)那么xinetd会自动开启你开启的东西,如果xinetd没有启动,可以设定启动

sudo chkconfig xinetd on

sudo service xinetd start

这里需要注意一下的是,如果你的git源不是放在/var/lib/git下面(default)那么你需要设定以下 /etc/xinetd.d/git这个文件中的server_args这个参数,server_args这里告诉git要去哪里找git的源,另外如果不想每个repo都自动export(控制单个的repo)那么,你可以去掉 –export-all这个选项,但是每个独立的git project就需要有一个 git-daemon-export-ok 的文件才可以

16. 再次测试git的git协议是否工作

cd /tmp

rm -rf test

git clone git://localhost/test

再次确定我们有checkout我们的project出来

17. 查看更改/etc/gitweb.conf来设定gitweb

这个就是个人偏好设定了,我是只有设定@git_base_url_list给了http,git跟ssh三个url(显示的时候用)

18. rpmforce  gitweb的安装套件已经帮你设定了apache所需要的东西,url是你服务器下面的 http://xxxxxx/git

Alias /git /usr/share/gitweb
<Directory /usr/share/gitweb>
Options +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
</Directory>
这里看到套件已经设定好cgi是izai/usr/share/gitweb下面

打开游览器,http://localhost/git你就可以看到自己的test的project了

 

移植svn到git

这个就很简单了,可以用git svn这个指令

我svn里有71个project,在同一个文件夹下面已经checkout出来过了,现在用git svn再次checkout一次就好(所有svn的project名字在/tmp/svn/下面)

mkdir -p /tmp/git/git-svn

cd /tmp/git/git-svn

#也可以直接建立一个txt文件,里面写上所有的svn中的project的名字,然后直接for x in $(cat svn_name.txt)

for x in /tmp/svn/*; do git svn clone –no-metadata http://localhost/svn/$(echo $x|awk -F ‘/’ ‘{print $NF}’)

这样我就得到了71个git从svn中checkout的全部project(这个要跑很久,因为所有的commit,log都会check出来)

不确定是否一定需要,不过我还是再次从git svn中所checkout的东西用git再clone一下(纯粹的git)

mkdir -p /tmp/git/git

cd /tmp/git/git

for x in /tmp/git/git-svn/*; do git clont $x git clone $x; done

清空/var/lib/git,然后生成所有的project

for x in /tmp/git/git/*; do mkdir /var/lib/git/$(echo $x |awk -F ‘/’ ‘{print $NF}’); done

所有的git都需要init一下,就是之前我们init那个test的projet的指令

for x in /var/lib/git/*; do cd $x; git –bare –shared, mv hooks/post-update.sample hooks/post-update; git update-server-info; cd ../; done

这个时候所有的project都做好,源码也在/tmp/git/git下面了,我们直接用git的指令push回我们的git server就好

做之前,在自己的account设定好rsa的login,这样可以省去输入密码

下面步骤可以一起做,这里为了便于游览,我分开来

第一个是加入git服务器的源,这里随便起名字叫做mygit

for x in /tmp/git/git/*; do cd $x; git remote add mygit ssh@localhost:/var/lib/git/$(echo $x|awk -F ‘/’ ‘{print $NF}’); done

第二个是push我们的local的change回服务器

for x in /tmp/git/git/*; do cd $x;  git push mygit master; done

最后的步骤就是,以前还有些python写的网页工具什么的,要一起移植过来

安装mod_python

sudo yum install mod_python

把老的python的那些工具网页放在http://xxxx/tools下面,所以增加一个handler

sudo vim /etc/httpd/conf.d/tools

<Directory /var/www/html/tools>
SetHandler mod_python
PythonHandler mod_python.publisher
PythonDebug On
Options FollowSymLinks
AllowOverride None
</Directory>

从前的主页我直接放个index.html做redirect到我tools这个地方

sudo vim /var/www/html/index.html

<html>
<title></title>
<HEAD><meta HTTP-EQUIV=”REFRESH” content=”0; url=http://10.1.50.24/tools”></HEAD>
</html>

重新跑一下apache

sudo service httpd restart
就这么简单,就可以设定好一个git的服务器,另外所有的svn的源码都移植过去。不计算git svn在pull旧的svn源码的时间,整个设定过程不到30分钟就可以搞定了。