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分钟就可以搞定了。