最近,软件部需要一个版本控制系统,经过讨论,我们选择了git。对于git和其他版本控制系统如SVN、CVS的区别比较大家可以自己上网查阅。下面我们开始安装git服务。
一、安装git
[root@centos ~]# wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
ps:网上一些文档给的下载地址是无效的,当然我们也可以到github下载
[root@centos ~]# tar xvf git-latest.tar.gz
[root@centos ~]# ls
[root@centos ~]# cd git-$(date)/
[root@centos ~]# yum install autoconf automake
[root@centos git-$(date)]# autoconf
[root@centos git-$(date)]# mkdir -p /usr/local/git/
[root@centos git-$(date)]# ls /usr/local/
[root@centos git-$(date)# ./configure --prefix=/usr/local/git
[root@centos git-$(date)]# make
在此遇到了一些问题,一些git需要的包没安装,之前已经安装了部分,此时我缺少的是,
[root@centos git-$(date)]# yum install curl curl-devel expat-devel
我们应该以自己的系统为准,先安装,错误提示缺少什么再安装什么,这也会是我们经验积累的一个途径,一般git依赖以下几个包:curl curl-devel zlib-devel perl cpio expat-devel gettext-devel。
[root@centos git-$(date)]# make install
[root@centos git-$(date)]# git --version
git version 1.7.12-rc2
到此,git安装成功。建议学习下git的相关操作,即使你自己不写代码,不使用版本控制系统,接下来配置gitosis会用到。
二、安装及配置gitosis
git的服务管理工具有gitosis、gitolite,个人比较喜欢gitolite,但因为刚学习了git,有些概念还不清楚,鉴于gitosis的资料比较多,感觉比较好掌握,就选择了gitosis,在以后难免会迁移到gitolite。
开始安装gitosis:
下载gitosis:
[root@centos gitosis]# git clone git://github.com/res0nat0r/gitosis.git
安装gitosis时我们使用python setup.py install所以要先安装python的setup tool,用ez_setup.py安装。
[root@centos ~]# wget http://peak.telecommunity.com/dist/ez_setup.py
[root@centos ~]# python ez_setup.py
[root@centos ~]# python -c "import setuptools" //测试setuptool是否装上,无输出即装上。
安装gitosis:
[root@centos ~]# cd gitosis/
[root@centos gitosis]# python setup.py install
gitosis安装结束,接下来进行配置:
[root@centos ~]# useradd -s /bin/bash -d /git/ git
/git为放置版本库的位置。
ps:网上有些文档指定shell环境为/bin/sh或者/bin/nologin,我建议先指定/bin/bash配置完成后再usermod进行修改,这是因为之前我配置时因为自己的一些错误加上环境变量,gitosis在初始gitosis-admin库时始终出错,困扰了我好几天。
[root@centos ~]#su - git
[git@centos ~]$vi .bashrc
在末尾添加export PATH=/usr/local/git/bin:/usr/local/git/libexec/git-core:$PATH 。 环境变量一定要添加上,不然会报错。
在开发的机子上生成公共密钥:
ssh-keygen -t rsa //如果在windows下一般也安装了msysgit可以进入git bash 或者也有生成公钥的工具。
上传密钥到服务器:
scp ~/.ssh/id_rsa.pub root@xxx:/tmp/
环境变量生效后在服务器上进行gitosis-admin管理版本库初始化,:
[git@centos ~]$ gitosis-init <</tmp/id_rsa.pub
初始化后的管理版本库位于/git/repositories 建立其他版本库也应该在这里。如何配置权限、新建版本库、更新等,大部分是git相关命令,也足够在写一篇博文了,就不写了。接下来我就记录几个自己遇到的问题。
问题一、
[root@centos ~]# sudo -H -u git gitosis-init < /tmp/id_rsa.pub
Traceback (most recent call last):
File "/usr/local/bin/gitosis-init", line 8, in <module>
load_entry_point('gitosis==0.2', 'console_scripts', 'gitosis-init')()
File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 24, in run
return app.main()
File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 38, in main
self.handle_args(parser, cfg, options, args)
File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 138, in handle_args
user=user,
File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 75, in init_admin_repository
template=resource_filename('gitosis.templates', 'admin')
File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/repository.py", line 63, in init
close_fds=True,
File "/usr/local/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/local/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
出现这样是环境变量出了问题,你可以用root直接执行 gitosis-init < /tmp/id_rsa.pub 看是否会出现同样的问题。当然root的环境变量记得加上。如我的是git的安装目录下这两个目录bin、libexec 。之前因为是自己出错把git下的lib和libexec放在/root结果无论怎样设置git用户的环境变量,cp还是添加软链接总是提示出错。加sudo命令也是出错,后来才知道sudo命令后并不继承root,或者git用户的环境。加上之前怀疑python安装有问题,一直测试、搜索,这个问题困扰了好几天。能肯定的是如果出现上面提示的极有可能是环境变量的问题。
问题二、
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To [email protected]:/var/git.server/.../web
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '[email protected]:/var/git.server/.../web'
这是因为你在初始版本库是不是建立裸库即加上--bare参数,git服务器拒绝了push命令,设置下就可以了
[git@centos tt.git]$ git config receive.denyCurrentBranch "warn"
一般来说初始git时也应该设置user.name user.email。